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