aboutsummaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorDavid S. Miller <davem@davemloft.net>2008-07-18 05:39:39 -0400
committerDavid S. Miller <davem@davemloft.net>2008-07-18 05:39:39 -0400
commit49997d75152b3d23c53b0fa730599f2f74c92c65 (patch)
tree46e93126170d02cfec9505172e545732c1b69656 /lib
parenta0c80b80e0fb48129e4e9d6a9ede914f9ff1850d (diff)
parent5b664cb235e97afbf34db9c4d77f08ebd725335e (diff)
Merge branch 'master' of master.kernel.org:/pub/scm/linux/kernel/git/torvalds/linux-2.6
Conflicts: Documentation/powerpc/booting-without-of.txt drivers/atm/Makefile drivers/net/fs_enet/fs_enet-main.c drivers/pci/pci-acpi.c net/8021q/vlan.c net/iucv/iucv.c
Diffstat (limited to 'lib')
-rw-r--r--lib/Kconfig7
-rw-r--r--lib/Kconfig.debug26
-rw-r--r--lib/Makefile6
-rw-r--r--lib/bug.c2
-rw-r--r--lib/crc-t10dif.c67
-rw-r--r--lib/kobject.c1
-rw-r--r--lib/percpu_counter.c7
-rw-r--r--lib/radix-tree.c2
-rw-r--r--lib/smp_processor_id.c6
-rw-r--r--lib/textsearch.c1
-rw-r--r--lib/vsprintf.c128
11 files changed, 211 insertions, 42 deletions
diff --git a/lib/Kconfig b/lib/Kconfig
index 8cc8e8722a3..c7ad7a5b353 100644
--- a/lib/Kconfig
+++ b/lib/Kconfig
@@ -29,6 +29,13 @@ config CRC16
29 the kernel tree does. Such modules that use library CRC16 29 the kernel tree does. Such modules that use library CRC16
30 functions require M here. 30 functions require M here.
31 31
32config CRC_T10DIF
33 tristate "CRC calculation for the T10 Data Integrity Field"
34 help
35 This option is only needed if a module that's not in the
36 kernel tree needs to calculate CRC checks for use with the
37 SCSI data integrity subsystem.
38
32config CRC_ITU_T 39config CRC_ITU_T
33 tristate "CRC ITU-T V.41 functions" 40 tristate "CRC ITU-T V.41 functions"
34 help 41 help
diff --git a/lib/Kconfig.debug b/lib/Kconfig.debug
index d2099f41aa1..df27132a56f 100644
--- a/lib/Kconfig.debug
+++ b/lib/Kconfig.debug
@@ -419,7 +419,6 @@ config DEBUG_LOCKING_API_SELFTESTS
419 419
420config STACKTRACE 420config STACKTRACE
421 bool 421 bool
422 depends on DEBUG_KERNEL
423 depends on STACKTRACE_SUPPORT 422 depends on STACKTRACE_SUPPORT
424 423
425config DEBUG_KOBJECT 424config DEBUG_KOBJECT
@@ -531,16 +530,34 @@ config BOOT_PRINTK_DELAY
531config RCU_TORTURE_TEST 530config RCU_TORTURE_TEST
532 tristate "torture tests for RCU" 531 tristate "torture tests for RCU"
533 depends on DEBUG_KERNEL 532 depends on DEBUG_KERNEL
534 depends on m
535 default n 533 default n
536 help 534 help
537 This option provides a kernel module that runs torture tests 535 This option provides a kernel module that runs torture tests
538 on the RCU infrastructure. The kernel module may be built 536 on the RCU infrastructure. The kernel module may be built
539 after the fact on the running kernel to be tested, if desired. 537 after the fact on the running kernel to be tested, if desired.
540 538
539 Say Y here if you want RCU torture tests to be built into
540 the kernel.
541 Say M if you want the RCU torture tests to build as a module. 541 Say M if you want the RCU torture tests to build as a module.
542 Say N if you are unsure. 542 Say N if you are unsure.
543 543
544config RCU_TORTURE_TEST_RUNNABLE
545 bool "torture tests for RCU runnable by default"
546 depends on RCU_TORTURE_TEST = y
547 default n
548 help
549 This option provides a way to build the RCU torture tests
550 directly into the kernel without them starting up at boot
551 time. You can use /proc/sys/kernel/rcutorture_runnable
552 to manually override this setting. This /proc file is
553 available only when the RCU torture tests have been built
554 into the kernel.
555
556 Say Y here if you want the RCU torture tests to start during
557 boot (you probably don't).
558 Say N here if you want the RCU torture tests to start only
559 after being manually enabled via /proc.
560
544config KPROBES_SANITY_TEST 561config KPROBES_SANITY_TEST
545 bool "Kprobes sanity tests" 562 bool "Kprobes sanity tests"
546 depends on DEBUG_KERNEL 563 depends on DEBUG_KERNEL
@@ -563,6 +580,9 @@ config BACKTRACE_SELF_TEST
563 for distributions or general kernels, but only for kernel 580 for distributions or general kernels, but only for kernel
564 developers working on architecture code. 581 developers working on architecture code.
565 582
583 Note that if you want to also test saved backtraces, you will
584 have to enable STACKTRACE as well.
585
566 Say N if you are unsure. 586 Say N if you are unsure.
567 587
568config LKDTM 588config LKDTM
@@ -634,6 +654,8 @@ config LATENCYTOP
634 Enable this option if you want to use the LatencyTOP tool 654 Enable this option if you want to use the LatencyTOP tool
635 to find out which userspace is blocking on what kernel operations. 655 to find out which userspace is blocking on what kernel operations.
636 656
657source kernel/trace/Kconfig
658
637config PROVIDE_OHCI1394_DMA_INIT 659config PROVIDE_OHCI1394_DMA_INIT
638 bool "Remote debugging over FireWire early on boot" 660 bool "Remote debugging over FireWire early on boot"
639 depends on PCI && X86 661 depends on PCI && X86
diff --git a/lib/Makefile b/lib/Makefile
index 74b0cfb1fcc..818c4d45551 100644
--- a/lib/Makefile
+++ b/lib/Makefile
@@ -2,6 +2,11 @@
2# Makefile for some libs needed in the kernel. 2# Makefile for some libs needed in the kernel.
3# 3#
4 4
5ifdef CONFIG_FTRACE
6ORIG_CFLAGS := $(KBUILD_CFLAGS)
7KBUILD_CFLAGS = $(subst -pg,,$(ORIG_CFLAGS))
8endif
9
5lib-y := ctype.o string.o vsprintf.o cmdline.o \ 10lib-y := ctype.o string.o vsprintf.o cmdline.o \
6 rbtree.o radix-tree.o dump_stack.o \ 11 rbtree.o radix-tree.o dump_stack.o \
7 idr.o int_sqrt.o extable.o prio_tree.o \ 12 idr.o int_sqrt.o extable.o prio_tree.o \
@@ -45,6 +50,7 @@ endif
45obj-$(CONFIG_BITREVERSE) += bitrev.o 50obj-$(CONFIG_BITREVERSE) += bitrev.o
46obj-$(CONFIG_CRC_CCITT) += crc-ccitt.o 51obj-$(CONFIG_CRC_CCITT) += crc-ccitt.o
47obj-$(CONFIG_CRC16) += crc16.o 52obj-$(CONFIG_CRC16) += crc16.o
53obj-$(CONFIG_CRC_T10DIF)+= crc-t10dif.o
48obj-$(CONFIG_CRC_ITU_T) += crc-itu-t.o 54obj-$(CONFIG_CRC_ITU_T) += crc-itu-t.o
49obj-$(CONFIG_CRC32) += crc32.o 55obj-$(CONFIG_CRC32) += crc32.o
50obj-$(CONFIG_CRC7) += crc7.o 56obj-$(CONFIG_CRC7) += crc7.o
diff --git a/lib/bug.c b/lib/bug.c
index 530f38f5578..bfeafd60ee9 100644
--- a/lib/bug.c
+++ b/lib/bug.c
@@ -37,6 +37,7 @@
37 */ 37 */
38#include <linux/list.h> 38#include <linux/list.h>
39#include <linux/module.h> 39#include <linux/module.h>
40#include <linux/kernel.h>
40#include <linux/bug.h> 41#include <linux/bug.h>
41#include <linux/sched.h> 42#include <linux/sched.h>
42 43
@@ -149,6 +150,7 @@ enum bug_trap_type report_bug(unsigned long bugaddr, struct pt_regs *regs)
149 (void *)bugaddr); 150 (void *)bugaddr);
150 151
151 show_regs(regs); 152 show_regs(regs);
153 add_taint(TAINT_WARN);
152 return BUG_TRAP_TYPE_WARN; 154 return BUG_TRAP_TYPE_WARN;
153 } 155 }
154 156
diff --git a/lib/crc-t10dif.c b/lib/crc-t10dif.c
new file mode 100644
index 00000000000..fbbd66ed86c
--- /dev/null
+++ b/lib/crc-t10dif.c
@@ -0,0 +1,67 @@
1/*
2 * T10 Data Integrity Field CRC16 calculation
3 *
4 * Copyright (c) 2007 Oracle Corporation. All rights reserved.
5 * Written by Martin K. Petersen <martin.petersen@oracle.com>
6 *
7 * This source code is licensed under the GNU General Public License,
8 * Version 2. See the file COPYING for more details.
9 */
10
11#include <linux/types.h>
12#include <linux/module.h>
13#include <linux/crc-t10dif.h>
14
15/* Table generated using the following polynomium:
16 * x^16 + x^15 + x^11 + x^9 + x^8 + x^7 + x^5 + x^4 + x^2 + x + 1
17 * gt: 0x8bb7
18 */
19static const __u16 t10_dif_crc_table[256] = {
20 0x0000, 0x8BB7, 0x9CD9, 0x176E, 0xB205, 0x39B2, 0x2EDC, 0xA56B,
21 0xEFBD, 0x640A, 0x7364, 0xF8D3, 0x5DB8, 0xD60F, 0xC161, 0x4AD6,
22 0x54CD, 0xDF7A, 0xC814, 0x43A3, 0xE6C8, 0x6D7F, 0x7A11, 0xF1A6,
23 0xBB70, 0x30C7, 0x27A9, 0xAC1E, 0x0975, 0x82C2, 0x95AC, 0x1E1B,
24 0xA99A, 0x222D, 0x3543, 0xBEF4, 0x1B9F, 0x9028, 0x8746, 0x0CF1,
25 0x4627, 0xCD90, 0xDAFE, 0x5149, 0xF422, 0x7F95, 0x68FB, 0xE34C,
26 0xFD57, 0x76E0, 0x618E, 0xEA39, 0x4F52, 0xC4E5, 0xD38B, 0x583C,
27 0x12EA, 0x995D, 0x8E33, 0x0584, 0xA0EF, 0x2B58, 0x3C36, 0xB781,
28 0xD883, 0x5334, 0x445A, 0xCFED, 0x6A86, 0xE131, 0xF65F, 0x7DE8,
29 0x373E, 0xBC89, 0xABE7, 0x2050, 0x853B, 0x0E8C, 0x19E2, 0x9255,
30 0x8C4E, 0x07F9, 0x1097, 0x9B20, 0x3E4B, 0xB5FC, 0xA292, 0x2925,
31 0x63F3, 0xE844, 0xFF2A, 0x749D, 0xD1F6, 0x5A41, 0x4D2F, 0xC698,
32 0x7119, 0xFAAE, 0xEDC0, 0x6677, 0xC31C, 0x48AB, 0x5FC5, 0xD472,
33 0x9EA4, 0x1513, 0x027D, 0x89CA, 0x2CA1, 0xA716, 0xB078, 0x3BCF,
34 0x25D4, 0xAE63, 0xB90D, 0x32BA, 0x97D1, 0x1C66, 0x0B08, 0x80BF,
35 0xCA69, 0x41DE, 0x56B0, 0xDD07, 0x786C, 0xF3DB, 0xE4B5, 0x6F02,
36 0x3AB1, 0xB106, 0xA668, 0x2DDF, 0x88B4, 0x0303, 0x146D, 0x9FDA,
37 0xD50C, 0x5EBB, 0x49D5, 0xC262, 0x6709, 0xECBE, 0xFBD0, 0x7067,
38 0x6E7C, 0xE5CB, 0xF2A5, 0x7912, 0xDC79, 0x57CE, 0x40A0, 0xCB17,
39 0x81C1, 0x0A76, 0x1D18, 0x96AF, 0x33C4, 0xB873, 0xAF1D, 0x24AA,
40 0x932B, 0x189C, 0x0FF2, 0x8445, 0x212E, 0xAA99, 0xBDF7, 0x3640,
41 0x7C96, 0xF721, 0xE04F, 0x6BF8, 0xCE93, 0x4524, 0x524A, 0xD9FD,
42 0xC7E6, 0x4C51, 0x5B3F, 0xD088, 0x75E3, 0xFE54, 0xE93A, 0x628D,
43 0x285B, 0xA3EC, 0xB482, 0x3F35, 0x9A5E, 0x11E9, 0x0687, 0x8D30,
44 0xE232, 0x6985, 0x7EEB, 0xF55C, 0x5037, 0xDB80, 0xCCEE, 0x4759,
45 0x0D8F, 0x8638, 0x9156, 0x1AE1, 0xBF8A, 0x343D, 0x2353, 0xA8E4,
46 0xB6FF, 0x3D48, 0x2A26, 0xA191, 0x04FA, 0x8F4D, 0x9823, 0x1394,
47 0x5942, 0xD2F5, 0xC59B, 0x4E2C, 0xEB47, 0x60F0, 0x779E, 0xFC29,
48 0x4BA8, 0xC01F, 0xD771, 0x5CC6, 0xF9AD, 0x721A, 0x6574, 0xEEC3,
49 0xA415, 0x2FA2, 0x38CC, 0xB37B, 0x1610, 0x9DA7, 0x8AC9, 0x017E,
50 0x1F65, 0x94D2, 0x83BC, 0x080B, 0xAD60, 0x26D7, 0x31B9, 0xBA0E,
51 0xF0D8, 0x7B6F, 0x6C01, 0xE7B6, 0x42DD, 0xC96A, 0xDE04, 0x55B3
52};
53
54__u16 crc_t10dif(const unsigned char *buffer, size_t len)
55{
56 __u16 crc = 0;
57 unsigned int i;
58
59 for (i = 0 ; i < len ; i++)
60 crc = (crc << 8) ^ t10_dif_crc_table[((crc >> 8) ^ buffer[i]) & 0xff];
61
62 return crc;
63}
64EXPORT_SYMBOL(crc_t10dif);
65
66MODULE_DESCRIPTION("T10 DIF CRC calculation");
67MODULE_LICENSE("GPL");
diff --git a/lib/kobject.c b/lib/kobject.c
index 718e5101c26..dcade0543bd 100644
--- a/lib/kobject.c
+++ b/lib/kobject.c
@@ -439,6 +439,7 @@ out:
439 439
440 return error; 440 return error;
441} 441}
442EXPORT_SYMBOL_GPL(kobject_rename);
442 443
443/** 444/**
444 * kobject_move - move object to another parent 445 * kobject_move - move object to another parent
diff --git a/lib/percpu_counter.c b/lib/percpu_counter.c
index 119174494cb..4a8ba4bf5f6 100644
--- a/lib/percpu_counter.c
+++ b/lib/percpu_counter.c
@@ -52,7 +52,7 @@ EXPORT_SYMBOL(__percpu_counter_add);
52 * Add up all the per-cpu counts, return the result. This is a more accurate 52 * Add up all the per-cpu counts, return the result. This is a more accurate
53 * but much slower version of percpu_counter_read_positive() 53 * but much slower version of percpu_counter_read_positive()
54 */ 54 */
55s64 __percpu_counter_sum(struct percpu_counter *fbc) 55s64 __percpu_counter_sum(struct percpu_counter *fbc, int set)
56{ 56{
57 s64 ret; 57 s64 ret;
58 int cpu; 58 int cpu;
@@ -62,7 +62,12 @@ s64 __percpu_counter_sum(struct percpu_counter *fbc)
62 for_each_online_cpu(cpu) { 62 for_each_online_cpu(cpu) {
63 s32 *pcount = per_cpu_ptr(fbc->counters, cpu); 63 s32 *pcount = per_cpu_ptr(fbc->counters, cpu);
64 ret += *pcount; 64 ret += *pcount;
65 if (set)
66 *pcount = 0;
65 } 67 }
68 if (set)
69 fbc->count = ret;
70
66 spin_unlock(&fbc->lock); 71 spin_unlock(&fbc->lock);
67 return ret; 72 return ret;
68} 73}
diff --git a/lib/radix-tree.c b/lib/radix-tree.c
index 169a2f8dabc..56ec21a7f73 100644
--- a/lib/radix-tree.c
+++ b/lib/radix-tree.c
@@ -1,7 +1,7 @@
1/* 1/*
2 * Copyright (C) 2001 Momchil Velikov 2 * Copyright (C) 2001 Momchil Velikov
3 * Portions Copyright (C) 2001 Christoph Hellwig 3 * Portions Copyright (C) 2001 Christoph Hellwig
4 * Copyright (C) 2005 SGI, Christoph Lameter <clameter@sgi.com> 4 * Copyright (C) 2005 SGI, Christoph Lameter
5 * Copyright (C) 2006 Nick Piggin 5 * Copyright (C) 2006 Nick Piggin
6 * 6 *
7 * This program is free software; you can redistribute it and/or 7 * This program is free software; you can redistribute it and/or
diff --git a/lib/smp_processor_id.c b/lib/smp_processor_id.c
index 6c90fb90e19..3b4dc098181 100644
--- a/lib/smp_processor_id.c
+++ b/lib/smp_processor_id.c
@@ -7,7 +7,7 @@
7#include <linux/kallsyms.h> 7#include <linux/kallsyms.h>
8#include <linux/sched.h> 8#include <linux/sched.h>
9 9
10unsigned int debug_smp_processor_id(void) 10notrace unsigned int debug_smp_processor_id(void)
11{ 11{
12 unsigned long preempt_count = preempt_count(); 12 unsigned long preempt_count = preempt_count();
13 int this_cpu = raw_smp_processor_id(); 13 int this_cpu = raw_smp_processor_id();
@@ -37,7 +37,7 @@ unsigned int debug_smp_processor_id(void)
37 /* 37 /*
38 * Avoid recursion: 38 * Avoid recursion:
39 */ 39 */
40 preempt_disable(); 40 preempt_disable_notrace();
41 41
42 if (!printk_ratelimit()) 42 if (!printk_ratelimit())
43 goto out_enable; 43 goto out_enable;
@@ -49,7 +49,7 @@ unsigned int debug_smp_processor_id(void)
49 dump_stack(); 49 dump_stack();
50 50
51out_enable: 51out_enable:
52 preempt_enable_no_resched(); 52 preempt_enable_no_resched_notrace();
53out: 53out:
54 return this_cpu; 54 return this_cpu;
55} 55}
diff --git a/lib/textsearch.c b/lib/textsearch.c
index b451fcc9354..4b7c6075256 100644
--- a/lib/textsearch.c
+++ b/lib/textsearch.c
@@ -99,6 +99,7 @@
99#include <linux/types.h> 99#include <linux/types.h>
100#include <linux/string.h> 100#include <linux/string.h>
101#include <linux/init.h> 101#include <linux/init.h>
102#include <linux/rculist.h>
102#include <linux/rcupdate.h> 103#include <linux/rcupdate.h>
103#include <linux/err.h> 104#include <linux/err.h>
104#include <linux/textsearch.h> 105#include <linux/textsearch.h>
diff --git a/lib/vsprintf.c b/lib/vsprintf.c
index 6021757a449..1dc2d1d18fa 100644
--- a/lib/vsprintf.c
+++ b/lib/vsprintf.c
@@ -22,6 +22,8 @@
22#include <linux/string.h> 22#include <linux/string.h>
23#include <linux/ctype.h> 23#include <linux/ctype.h>
24#include <linux/kernel.h> 24#include <linux/kernel.h>
25#include <linux/kallsyms.h>
26#include <linux/uaccess.h>
25 27
26#include <asm/page.h> /* for PAGE_SIZE */ 28#include <asm/page.h> /* for PAGE_SIZE */
27#include <asm/div64.h> 29#include <asm/div64.h>
@@ -482,6 +484,89 @@ static char *number(char *buf, char *end, unsigned long long num, int base, int
482 return buf; 484 return buf;
483} 485}
484 486
487static char *string(char *buf, char *end, char *s, int field_width, int precision, int flags)
488{
489 int len, i;
490
491 if ((unsigned long)s < PAGE_SIZE)
492 s = "<NULL>";
493
494 len = strnlen(s, precision);
495
496 if (!(flags & LEFT)) {
497 while (len < field_width--) {
498 if (buf < end)
499 *buf = ' ';
500 ++buf;
501 }
502 }
503 for (i = 0; i < len; ++i) {
504 if (buf < end)
505 *buf = *s;
506 ++buf; ++s;
507 }
508 while (len < field_width--) {
509 if (buf < end)
510 *buf = ' ';
511 ++buf;
512 }
513 return buf;
514}
515
516static inline void *dereference_function_descriptor(void *ptr)
517{
518#if defined(CONFIG_IA64) || defined(CONFIG_PPC64)
519 void *p;
520 if (!probe_kernel_address(ptr, p))
521 ptr = p;
522#endif
523 return ptr;
524}
525
526static char *symbol_string(char *buf, char *end, void *ptr, int field_width, int precision, int flags)
527{
528 unsigned long value = (unsigned long) ptr;
529#ifdef CONFIG_KALLSYMS
530 char sym[KSYM_SYMBOL_LEN];
531 sprint_symbol(sym, value);
532 return string(buf, end, sym, field_width, precision, flags);
533#else
534 field_width = 2*sizeof(void *);
535 flags |= SPECIAL | SMALL | ZEROPAD;
536 return number(buf, end, value, 16, field_width, precision, flags);
537#endif
538}
539
540/*
541 * Show a '%p' thing. A kernel extension is that the '%p' is followed
542 * by an extra set of alphanumeric characters that are extended format
543 * specifiers.
544 *
545 * Right now we just handle 'F' (for symbolic Function descriptor pointers)
546 * and 'S' (for Symbolic direct pointers), but this can easily be
547 * extended in the future (network address types etc).
548 *
549 * The difference between 'S' and 'F' is that on ia64 and ppc64 function
550 * pointers are really function descriptors, which contain a pointer the
551 * real address.
552 */
553static char *pointer(const char *fmt, char *buf, char *end, void *ptr, int field_width, int precision, int flags)
554{
555 switch (*fmt) {
556 case 'F':
557 ptr = dereference_function_descriptor(ptr);
558 /* Fallthrough */
559 case 'S':
560 return symbol_string(buf, end, ptr, field_width, precision, flags);
561 }
562 flags |= SMALL;
563 if (field_width == -1) {
564 field_width = 2*sizeof(void *);
565 flags |= ZEROPAD;
566 }
567 return number(buf, end, (unsigned long) ptr, 16, field_width, precision, flags);
568}
569
485/** 570/**
486 * vsnprintf - Format a string and place it in a buffer 571 * vsnprintf - Format a string and place it in a buffer
487 * @buf: The buffer to place the result into 572 * @buf: The buffer to place the result into
@@ -502,11 +587,9 @@ static char *number(char *buf, char *end, unsigned long long num, int base, int
502 */ 587 */
503int vsnprintf(char *buf, size_t size, const char *fmt, va_list args) 588int vsnprintf(char *buf, size_t size, const char *fmt, va_list args)
504{ 589{
505 int len;
506 unsigned long long num; 590 unsigned long long num;
507 int i, base; 591 int base;
508 char *str, *end, c; 592 char *str, *end, c;
509 const char *s;
510 593
511 int flags; /* flags to number() */ 594 int flags; /* flags to number() */
512 595
@@ -622,43 +705,18 @@ int vsnprintf(char *buf, size_t size, const char *fmt, va_list args)
622 continue; 705 continue;
623 706
624 case 's': 707 case 's':
625 s = va_arg(args, char *); 708 str = string(str, end, va_arg(args, char *), field_width, precision, flags);
626 if ((unsigned long)s < PAGE_SIZE)
627 s = "<NULL>";
628
629 len = strnlen(s, precision);
630
631 if (!(flags & LEFT)) {
632 while (len < field_width--) {
633 if (str < end)
634 *str = ' ';
635 ++str;
636 }
637 }
638 for (i = 0; i < len; ++i) {
639 if (str < end)
640 *str = *s;
641 ++str; ++s;
642 }
643 while (len < field_width--) {
644 if (str < end)
645 *str = ' ';
646 ++str;
647 }
648 continue; 709 continue;
649 710
650 case 'p': 711 case 'p':
651 flags |= SMALL; 712 str = pointer(fmt+1, str, end,
652 if (field_width == -1) { 713 va_arg(args, void *),
653 field_width = 2*sizeof(void *); 714 field_width, precision, flags);
654 flags |= ZEROPAD; 715 /* Skip all alphanumeric pointer suffixes */
655 } 716 while (isalnum(fmt[1]))
656 str = number(str, end, 717 fmt++;
657 (unsigned long) va_arg(args, void *),
658 16, field_width, precision, flags);
659 continue; 718 continue;
660 719
661
662 case 'n': 720 case 'n':
663 /* FIXME: 721 /* FIXME:
664 * What does C99 say about the overflow case here? */ 722 * What does C99 say about the overflow case here? */