Author: cieciwa                      Date: Wed Mar  2 12:58:40 2005 GMT
Module: SOURCES                       Tag: HEAD
---- Log message:
- EVLog support for PLD kernel

---- Files affected:
SOURCES:
   evlog-2.6.8-PLD.patch (NONE -> 1.1)  (NEW)

---- Diffs:

================================================================
Index: SOURCES/evlog-2.6.8-PLD.patch
diff -u /dev/null SOURCES/evlog-2.6.8-PLD.patch:1.1
--- /dev/null   Wed Mar  2 13:58:40 2005
+++ SOURCES/evlog-2.6.8-PLD.patch       Wed Mar  2 13:58:35 2005
@@ -0,0 +1,1688 @@
+diff -Nur linux-2.6.8.1.org/include/linux/device.h 
linux-2.6.8.1/include/linux/device.h
+--- linux-2.6.8.1.org/include/linux/device.h   2005-03-02 12:00:34.158312680 
+0100
++++ linux-2.6.8.1/include/linux/device.h       2005-03-02 13:17:48.124842688 
+0100
+@@ -21,6 +21,7 @@
+ #include <linux/pm.h>
+ #include <asm/semaphore.h>
+ #include <asm/atomic.h>
++#include <linux/printkat.h>
+ 
+ #define DEVICE_NAME_SIZE      50
+ #define DEVICE_NAME_HALF      __stringify(20) /* Less than half to 
accommodate slop */
+@@ -401,7 +402,8 @@
+ 
+ /* debugging and troubleshooting/diagnostic helpers. */
+ #define dev_printk(level, dev, format, arg...)        \
+-      printk(level "%s %s: " format , (dev)->driver ? (dev)->driver->name : 
"" , (dev)->bus_id , ## arg)
++      printkat(level "{driver}%s {busid}%s: " format "{{line}%d}" , \
++              (dev)->driver->name , (dev)->bus_id , ## arg , __LINE__)
+ 
+ #ifdef DEBUG
+ #define dev_dbg(dev, format, arg...)          \
+diff -Nur linux-2.6.8.1.org/include/linux/evlog.h 
linux-2.6.8.1/include/linux/evlog.h
+--- linux-2.6.8.1.org/include/linux/evlog.h    1970-01-01 01:00:00.000000000 
+0100
++++ linux-2.6.8.1/include/linux/evlog.h        2005-03-02 13:11:31.855044392 
+0100
+@@ -0,0 +1,134 @@
++/*
++ * Linux Event Logging
++ * Copyright (C) International Business Machines Corp., 2001
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License as published by
++ * the Free Software Foundation; either version 2 of the License, or
++ * (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
++ *
++ *  Please send e-mail to [EMAIL PROTECTED] if you have
++ *  questions or comments.
++ *
++ *  Project Website:  http://evlog.sourceforge.net/
++ */
++
++#ifndef _LINUX_EVLOG_H
++#define _LINUX_EVLOG_H
++
++#include <stdarg.h>
++#include <linux/types.h>
++#include <asm/types.h>
++
++/* Values for log_flags member */
++#define EVL_TRUNCATE          0x1
++#define EVL_KERNEL_EVENT      0x2
++#define EVL_INITIAL_BOOT_EVENT        0x4
++#define EVL_KERNTIME_LOCAL    0x8
++#define EVL_INTERRUPT         0x10    /* Logged from interrupt context */
++#define EVL_PRINTK            0x20    /* Strip leading <n> when formatting */
++#define EVL_EVTYCRC           0x40    /* Daemon will set event type = CRC */
++                                      /* of format string. */
++
++/* Formats for optional portion of record. */
++#define EVL_NODATA    0
++#define EVL_BINARY    1
++#define EVL_STRING    2
++#define EVL_PRINTF    3
++
++/* Maximum length of variable portion of record */
++#define EVL_ENTRY_MAXLEN (8 * 1024)
++
++/* Facility (e.g., driver) names are truncated to 15+null. */
++#define FACILITY_MAXLEN 16
++
++/* struct kern_log_entry - kernel record header */
++struct kern_log_entry {
++      __u16   log_kmagic;     /* always LOGREC_KMAGIC */
++      __u16   log_kversion;   /* which version of this struct? */
++      __u16   log_size;       /* # bytes in variable part of record */
++      __s8    log_format;     /* BINARY, STRING, PRINTF, NODATA */
++      __s8    log_severity;   /* DEBUG, INFO, NOTICE, WARN, etc. */
++      __s32   log_event_type; /* facility-specific event ID */
++      __u32   log_flags;      /* EVL_TRUNCATE, etc. */
++      __s32   log_processor;  /* CPU ID */
++      time_t  log_time_sec;
++      __s32   log_time_nsec;
++      uid_t   log_uid;        /* event context... */
++      gid_t   log_gid;
++      pid_t   log_pid;
++      pid_t   log_pgrp;
++      char    log_facility[FACILITY_MAXLEN];  /* e.g., driver name */
++}; 
++
++#define LOGREC_KMAGIC 0x7af8
++#define LOGREC_KVERSION       3
++
++/* Reserved Event Types */
++#define EVL_BUFFER_OVERRUN    0x6
++
++#ifdef __KERNEL__
++/*
++ * severities, AKA priorities
++ */
++#define LOG_EMERG   0   /* system is unusable */
++#define LOG_ALERT   1   /* action must be taken immediately */
++#define LOG_CRIT    2   /* critical conditions */
++#define LOG_ERR     3   /* error conditions */
++#define LOG_WARNING 4   /* warning conditions */
++#define LOG_NOTICE  5   /* normal but significant condition */
++#define LOG_INFO    6   /* informational */
++#define LOG_DEBUG   7   /* debug-level messages */
++
++/*
++ * A buffer to pack with data, one value at a time.  By convention, b_tail
++ * reflects the total amount you've attempted to add, and so may be past 
b_end.
++ */
++struct evl_recbuf {
++      char *b_buf;    /* start of buffer */
++      char *b_tail;   /* add next data here */
++      char *b_end;    /* b_buf + buffer size */
++      char *b_argsz;  /* points to argsz word in EVL_PRINTF-format record */
++      char *b_zapped_nl;      /* where terminating newline was */
++};
++
++#ifdef CONFIG_EVLOG
++extern int evl_write(const char *facility, int event_type,
++      int severity, const void *buf, size_t len, uint flags, int format);
++extern int evl_printk(const char *facility, int event_type, int sev,
++      const char *fmt, ...);
++extern int evl_vprintk(const char *facility, int event_type, int sev,
++      const char *fmt, va_list args);
++
++/* Functions for hand-constructing event records */
++extern void evl_init_recbuf(struct evl_recbuf *b, char *buf, size_t size);
++extern void evl_put(struct evl_recbuf *b, const void *data, size_t datasz);
++extern void evl_puts(struct evl_recbuf *b, const char *s, int null);
++extern void evl_zap_newline(struct evl_recbuf *b);
++extern void evl_end_fmt(struct evl_recbuf *b);
++extern void evl_pack_args(struct evl_recbuf *b, const char *fmt, va_list 
args);
++extern void evl_end_args(struct evl_recbuf *b);
++#else /* ! CONFIG_EVLOG */
++static inline int evl_write(const char *facility, int event_type,
++      int severity, const void *buf, size_t len, uint flags, int format)
++      { return -ENOSYS; }
++static inline int evl_printk(const char *facility, int event_type, int sev,
++      const char *fmt, ...);
++      { return -ENOSYS; }
++static inline int evl_vprintk(const char *facility, int event_type, int sev,
++      const char *fmt, va_list args)
++      { return -ENOSYS; }
++#endif        /* CONFIG_EVLOG */
++
++#endif        /* __KERNEL__ */
++
++#endif        /* _LINUX_EVLOG_H */
+diff -Nur linux-2.6.8.1.org/include/linux/netdevice.h 
linux-2.6.8.1/include/linux/netdevice.h
+--- linux-2.6.8.1.org/include/linux/netdevice.h        2004-08-14 
12:56:22.000000000 +0200
++++ linux-2.6.8.1/include/linux/netdevice.h    2005-03-02 13:18:28.970633184 
+0100
+@@ -37,6 +37,7 @@
+ #include <linux/config.h>
+ #include <linux/device.h>
+ #include <linux/percpu.h>
++#include <linux/printkat.h>
+ 
+ struct divert_blk;
+ struct vlan_group;
+@@ -477,6 +478,9 @@
+       struct divert_blk       *divert;
+ #endif /* CONFIG_NET_DIVERT */
+ 
++      /* NETIF_MSG_* flags to control the types of events we log */
++      int msg_enable;
++
+       /* class/net/name entry */
+       struct class_device     class_dev;
+       struct net_device_stats* (*last_stats)(struct net_device *);
+@@ -778,6 +782,7 @@
+       NETIF_MSG_PKTDATA       = 0x1000,
+       NETIF_MSG_HW            = 0x2000,
+       NETIF_MSG_WOL           = 0x4000,
++      NETIF_MSG_ALL           = -1,           /* always log message */
+ };
+ 
+ #define netif_msg_drv(p)      ((p)->msg_enable & NETIF_MSG_DRV)
+@@ -946,6 +951,49 @@
+ extern char *net_sysctl_strdup(const char *s);
+ #endif
+ 
++/* debugging and troubleshooting/diagnostic helpers. */
++/**
++ * netdev_printk() - Log message with interface name, gated by message level
++ * @sevlevel: severity level -- e.g., KERN_INFO
++ * @netdev: net_device pointer
++ * @msglevel: a standard message-level flag with the NETIF_MSG_ prefix 
removed.
++ *    Unless msglevel is ALL, log the message only if that flag is set in
++ *    netdev->msg_enable.
++ * @format: as with printk
++ * @args: as with printk
++ */
++extern int __netdev_printk(const char *sevlevel,
++      const struct net_device *netdev, int msglevel, const char *format, ...);
++#define netdev_printk(sevlevel, netdev, msglevel, format, arg...)     \
++do {                                                                  \
++      if (__netdev_printk(sevlevel , netdev , NETIF_MSG_##msglevel ,  \
++          format , ## arg) == 0) {                                    \
++              printkat_noprintk(sevlevel                              \
++                      "{netdev}%s ({driver}%s {busid}%s) {msglvl}%s: "\
++                      format "{{line}%d}" , netdev->name ,            \
++                      netdev->class_dev.dev->driver->name ,           \
++                      netdev->class_dev.dev->bus_id , #msglevel ,     \
++                      ## arg , __LINE__);                             \
++      }                                                               \
++} while (0)
++#ifdef DEBUG
++#define netdev_dbg(netdev, msglevel, format, arg...)          \
++      netdev_printk(KERN_DEBUG , netdev , msglevel , format , ## arg)
++#else
++#define netdev_dbg(netdev, msglevel, format, arg...) do {} while (0)
++#endif
++
++#define netdev_err(netdev, msglevel, format, arg...)          \
++      netdev_printk(KERN_ERR , netdev , msglevel , format , ## arg)
++#define netdev_info(netdev, msglevel, format, arg...)         \
++      netdev_printk(KERN_INFO , netdev , msglevel , format , ## arg)
++#define netdev_warn(netdev, msglevel, format, arg...)         \
++      netdev_printk(KERN_WARNING , netdev , msglevel , format , ## arg)
++
++/* report fatal error unconditionally; msglevel ignored for now */
++#define netdev_fatal(netdev, msglevel, format, arg...)                \
++      netdev_printk(KERN_ERR , netdev , ALL , format , ## arg)
++
+ #endif /* __KERNEL__ */
+ 
+ #endif        /* _LINUX_DEV_H */
+diff -Nur linux-2.6.8.1.org/include/linux/printkat.h 
linux-2.6.8.1/include/linux/printkat.h
+--- linux-2.6.8.1.org/include/linux/printkat.h 1970-01-01 01:00:00.000000000 
+0100
++++ linux-2.6.8.1/include/linux/printkat.h     2005-03-02 13:18:40.092942336 
+0100
+@@ -0,0 +1,98 @@
++/*
++ * Linux Event Logging for the Enterprise
++ * Copyright (C) International Business Machines Corp., 2002
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License as published by
++ * the Free Software Foundation; either version 2 of the License, or
++ * (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
++ *
++ *  Please send e-mail to [EMAIL PROTECTED] if you have
++ *  questions or comments.
++ *
++ *  Project Website:  http://evlog.sourceforge.net/
++ */
++
++#ifndef _LINUX_PRINTKAT_H
++#define _LINUX_PRINTKAT_H
++
++extern int __printkat(const char *facname, int call_printk,
++      const char *fmt, ...);
++
++#ifndef CONFIG_EVLOG
++
++/* Just strip {id} constructs and call printk. */
++#define printkat(fmt, arg...) __printkat((const char*)0, 1, fmt, ## arg)
++#define printkat_noprintk(fmt, arg...) do {} while(0)
++
++#else /* CONFIG_EVLOG */
++
++#include <linux/stringify.h>
++#include <linux/kernel.h>
++#include <linux/evlog.h>
++
++/*
++ * Facility name defaults to the name of the module, as set in the kernel
++ * build, or to kern (the kernel default) if the module name is not set.
++ * Define EVL_FACILITY_NAME before including this file (or redefine it
++ * before calling printkat) if that's unsatisfactory.
++ *
++ * In a device driver, EVL_FACILITY_NAME should be the driver name (without
++ * quotes).
++ */
++#ifndef EVL_FACILITY_NAME
++#ifdef KBUILD_MODNAME
++#define EVL_FACILITY_NAME KBUILD_MODNAME
++#else
++#define EVL_FACILITY_NAME kern
++#endif
++#endif
++
++/* Bloat doesn't matter: this doesn't end up in vmlinux. */
++struct log_position {
++   int line;
++   char function[64 - sizeof(int)];
++   char file[128];
++};
++
++#define _LOG_POS { __LINE__, __FUNCTION__, __FILE__ }
++
++/*
++ * Information about a printkat() message.
++ * Again, bloat doesn't matter: this doesn't end up in vmlinux.
++ * Note that, because of default alignment in the .log section,
++ * sizeof(struct log_info) should be a multiple of 32.
++ */
++struct log_info {
++   char format[128+64];
++   char facility[64];
++   struct log_position pos;
++};
++
++#define printkat(fmt, arg...) \
++({ \
++   static struct log_info __attribute__((section(".log"),unused)) ___ \
++      = { fmt, __stringify(EVL_FACILITY_NAME), _LOG_POS }; \
++   __printkat(__stringify(EVL_FACILITY_NAME) , 1, fmt , ## arg); \
++})
++
++/* Same as printkat, but don't call printk. */
++#define printkat_noprintk(fmt, arg...) \
++({ \
++   static struct log_info __attribute__((section(".log"),unused)) ___ \
++      = { fmt, __stringify(EVL_FACILITY_NAME), _LOG_POS }; \
++   __printkat(__stringify(EVL_FACILITY_NAME) , 0, fmt , ## arg); \
++})
++
++#endif /* CONFIG_EVLOG */
++
++#endif /*_LINUX_PRINTKAT_H*/
+diff -Nur linux-2.6.8.1.org/init/Kconfig linux-2.6.8.1/init/Kconfig
+--- linux-2.6.8.1.org/init/Kconfig     2005-03-02 12:00:38.994577456 +0100
++++ linux-2.6.8.1/init/Kconfig 2005-03-02 13:11:31.857044088 +0100
+@@ -197,6 +197,19 @@
+         agent" (/sbin/hotplug) to load modules and set up software needed
+         to use devices as you hotplug them.
+ 
++config EVLOG
++      bool "Event logging support"
++      ---help---
++        This enables support for event logging based upon the draft
++        POSIX 1003.25 standard.  Enabling this feature does not
++        affect the operation of the klog/syslog package in any way.
++        In order to fully utilize this feature, user must also install
++        the companion evlog package in user-space.
++
++        For more information see http://evlog.sourceforge.net
++
++        If you don't know what to do here, say N.
++
+ config IKCONFIG
+       bool "Kernel .config support"
+       ---help---
+diff -Nur linux-2.6.8.1.org/kernel/Makefile linux-2.6.8.1/kernel/Makefile
+--- linux-2.6.8.1.org/kernel/Makefile  2005-03-02 12:00:29.913957920 +0100
++++ linux-2.6.8.1/kernel/Makefile      2005-03-02 13:13:03.103172568 +0100
+@@ -20,6 +20,7 @@
+ obj-$(CONFIG_COMPAT) += compat.o
+ obj-$(CONFIG_IKCONFIG) += configs.o
+ obj-$(CONFIG_IKCONFIG_PROC) += configs.o
++obj-$(CONFIG_EVLOG) += evlbuf.o evlapi.o
+ obj-$(CONFIG_STOP_MACHINE) += stop_machine.o
+ obj-$(CONFIG_AUDIT) += audit.o
+ obj-$(CONFIG_AUDITSYSCALL) += auditsc.o
+diff -Nur linux-2.6.8.1.org/kernel/evlapi.c linux-2.6.8.1/kernel/evlapi.c
+--- linux-2.6.8.1.org/kernel/evlapi.c  1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.8.1/kernel/evlapi.c      2005-03-02 13:18:40.093942184 +0100
+@@ -0,0 +1,499 @@
++/*
++ * Linux Event Logging
++ * Copyright (C) International Business Machines Corp., 2003
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License as published by
++ * the Free Software Foundation; either version 2 of the License, or
++ * (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
++ *
++ *  Please send e-mail to [EMAIL PROTECTED] if you have
++ *  questions or comments.
++ *
++ *  Project Website:  http://evlog.sourceforge.net/
++ */
++
++#include <linux/config.h>
++#include <linux/kernel.h>
++#include <linux/module.h>
++#include <linux/stddef.h>
++#include <linux/spinlock.h>
++#include <linux/string.h>
++#include <linux/ctype.h>
++#include <linux/evlog.h>
++
++extern void evl_mk_rechdr(struct kern_log_entry *hdr,
++      const char *facility, int event_type, int severity, size_t size,
++      uint flags, int format);
++extern int evl_writeh(struct kern_log_entry *hdr, const char *vardata);
++extern void evl_unbrace(char *dest, const char *src, int bufsz);
++
++/**
++ * evl_write() - write header + optional buffer to event handler
++ *
++ * @buf: optional variable-length data
++ * other args as per evl_mk_rechdr()
++ */
++int
++evl_write(const char *facility, int event_type, int severity, const void *buf,
++      size_t size, uint flags, int format)
++{
++      struct kern_log_entry hdr;
++
++      evl_mk_rechdr(&hdr, facility, event_type, severity, size, flags,
++              format);
++      return evl_writeh(&hdr, buf);
++}
++
++void
++evl_init_recbuf(struct evl_recbuf *b, char *buf, size_t size)
++{
++      b->b_buf = buf;
++      b->b_tail = buf;
++      b->b_end = buf + size;
++      b->b_zapped_nl = NULL;
++      b->b_argsz = NULL;
++}
++
++/**
++ * evl_put() - Append data to buffer; handle overflow.
++ * @b - describes buffer; updated to reflect data appended
++ * @data - data to append
++ * @datasz - data length in bytes
++ */
++void
++evl_put(struct evl_recbuf *b, const void *data, size_t datasz)
++{
++      ptrdiff_t room = b->b_end - b->b_tail;
++      if (room > 0) {
++              (void) memcpy(b->b_tail, data, min(datasz, (size_t)room));
++      }
++      b->b_tail += datasz;
++}
++
++/**
++ * evl_puts() - Append string to buffer; handle overflow.
++ * Append a string to the buffer.  If null == 1, we include the terminating
++ * null.  If the string extends over the end of the buffer, terminate the
++ * buffer with a null.
++ *
++ * @b - describes buffer; updated to reflect data appended
++ * @s - null-terminated string
++ * @null - 1 if we append the terminating null, 0 otherwise
++ */
++void
++evl_puts(struct evl_recbuf *b, const char *s, int null)
++{
++      char *old_tail = b->b_tail;
++      evl_put(b, s, strlen(s) + null);
++      if (b->b_tail > b->b_end && old_tail < b->b_end) {
++              *(b->b_end - 1) = '\0';
++      }
++}
++
++/**
++ * evl_zap_newline() - Delete newline at end of format string.
++ * Called after the format string has been copied into b.
++ * If the format ends in a newline, remove it.  We remove the
++ * terminating newline to increase flexibility when formatting
++ * the record for viewing.
++ */
++void
++evl_zap_newline(struct evl_recbuf *b)
++{
++      char *nl = b->b_tail - 2;
++      if (b->b_buf <= nl && nl < b->b_end && *nl == '\n') {
++              *nl = '\0';
++              b->b_tail--;
++              b->b_zapped_nl = nl;
++      }
++}
++
++/**
++ * evl_unzap_newline() - Replace previously zapped newline.
++ * NOTE: Replacing the newline (and advancing the terminating null)
++ * renders useless the contents of the record beyond the format string.
++ */
++void
++evl_unzap_newline(struct evl_recbuf *b)
++{
++      if (b->b_zapped_nl) {
++              b->b_zapped_nl[0] = '\n';
++              b->b_zapped_nl[1] = '\0';
++      }
++}
++
++/**
++ * evl_end_fmt() - Make and remember room for argsz word in EVL_PRINTF rec.
++ * Called after the format string has been copied in, but before the args.
++ * Store zero for now; evl_end_args() will store the actual size later.
++ */
++void
++evl_end_fmt(struct evl_recbuf *b)
++{
++      int argsz = 0;
++      b->b_argsz = b->b_tail;
++      evl_put(b, &argsz, sizeof(int));
++}
++
++/**
++ * evl_end_args() - For EVL_PRINTF record, store the argsz.
++ * Called after the args have been copied in.
++ */
++void
++evl_end_args(struct evl_recbuf *b)
++{
++      char *args;
++      int argsz;
++
++      if (! b->b_argsz) {
++              /* Nobody called evl_end_fmt(). */
++              return;
++      }
++      args = b->b_argsz + sizeof(int);
++      if (args > b->b_end) {
++              /* VERY long format string: even argsz is off end of record. */
++              return;
++      }
++      argsz = b->b_tail - args;
++      memcpy(b->b_argsz, &argsz, sizeof(int));
++}
++
++static inline void
++skip_atoi(const char **s)
++{
++      while (isdigit(**s)) {
++              (*s)++;
++      }
++}
++
++/**
++ * parse_printf_fmt() - Parse printf/printk conversion spec.
++ * fmt points to the '%' in a printk conversion specification.  Advance
++ * fmt past any flags, width and/or precision specifiers, and qualifiers
++ * such as 'l' and 'L'.  Return a pointer to the conversion character.
++ * Stores the qualifier character (or -1, if there is none) at *pqualifier.
++ * *wp is set to flags indicating whether the width and/or precision are '*'.
++ * For example, given
++ *      %*.2lx
++ * *pqualifier is set to 'l', *wp is set to 0x1, and a pointer to the 'x'
++ * is returned.
++ *
++ * Note: This function is derived from vsnprintf() (see lib/vsprintf.c),
++ * and should be kept in sync with that function.
++ *
++ * @fmt - points to '%' in conversion spec
++ * @pqualifier - *pqualifier is set to conversion spec's qualifier, or -1.
++ * @wp - Bits in *wp are set if the width or/and precision are '*'.
++ */
++const char *
++parse_printf_fmt(const char *fmt, int *pqualifier, int *wp)
++{
++      int qualifier = -1;
++      *wp = 0;
++
++      /* process flags */
++      repeat:
++              ++fmt;          /* this also skips first '%' */
++              switch (*fmt) {
++                      case '-':
++                      case '+':
++                      case ' ':
++                      case '#':
++                      case '0':
++                              goto repeat;
<<Diff was trimmed, longer than 597 lines>>

_______________________________________________
pld-cvs-commit mailing list
[email protected]
http://lists.pld-linux.org/mailman/listinfo/pld-cvs-commit

Reply via email to