annotate toys/pending/printf.c @ 1276:d48bdc1cb017 draft

Switch human_readable() to just outputing decimal kilo/mega/gigabytes, make du use it, move it from lib/pending.c to lib.c.
author Rob Landley <rob@landley.net>
date Tue, 06 May 2014 06:31:28 -0500
parents 2fe64bc16a61
children 54c092c3ee38
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1256
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
1 /* printf.c - Format and Print the data.
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
2 *
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
3 * Copyright 2014 Sandeep Sharma <sandeep.jack2756@gmail.com>
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
4 * Copyright 2014 Kyungwan Han <asura321@gmail.com>
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
5 *
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
6 * See http://pubs.opengroup.org/onlinepubs/9699919799/utilities/printf.html
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
7
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
8 USE_PRINTF(NEWTOY(printf, "<1", TOYFLAG_USR|TOYFLAG_BIN))
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
9
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
10 config PRINTF
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
11 bool "printf"
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
12 default n
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
13 help
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
14 usage: printf Format [Arguments..]
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
15
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
16 Format and print ARGUMENT(s) according to FORMAT.
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
17 Format is 'C' control output as 'C' printf.
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
18 */
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
19 #define FOR_printf
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
20 #include "toys.h"
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
21
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
22 GLOBALS(
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
23 char *hv_w;
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
24 char *hv_p;
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
25 int encountered;
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
26 )
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
27
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
28 // Calculate width and precision from format string
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
29 static int get_w_p()
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
30 {
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
31 char *ptr, *str = *toys.optargs;
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
32
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
33 errno = 0;
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
34 if (*str == '-') str++;
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
35 long value = strtol(str, &ptr, 10);
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
36 if (errno || (ptr && (*ptr != '\0' || ptr == str)))
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
37 perror_msg("Invalid num %s", *toys.optargs);
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
38 if (*--str == '-') return (int)(-1 * value);
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
39 return value;
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
40 }
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
41
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
42 // Add ll and L to Interger and floating point formats respectively.
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
43 static char *get_format(char *f)
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
44 {
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
45 int len = strlen(f);
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
46 char last = f[--len], *post = "";
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
47
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
48 f[len] = '\0';
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
49 if (strchr("diouxX", last)) post = "ll"; // add ll to integer modifier.
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
50 else if (strchr("feEgG", last)) post = "L"; // add L to float modifier.
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
51 return xmprintf("%s%s%c", f, post, last);
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
52 }
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
53
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
54 // Print arguments with corresponding conversion and width and precision.
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
55 static void print(char *fmt, int w, int p, int l)
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
56 {
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
57 char *ptr = (fmt+l-1), *ep = NULL, *format = NULL;
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
58 long long val;
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
59 long double dval;
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
60
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
61 errno = 0;
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
62 switch (*ptr) {
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
63 case 'd': /*FALL_THROUGH*/
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
64 case 'i': /*FALL_THROUGH*/
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
65 case 'o': /*FALL_THROUGH*/
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
66 case 'u': /*FALL_THROUGH*/
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
67 case 'x': /*FALL_THROUGH*/
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
68 case 'X':
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
69 if (!*toys.optargs) val = 0;
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
70 else {
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
71 if (**toys.optargs == '\'' || **toys.optargs == '"')
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
72 val = *((*toys.optargs) + 1);
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
73 else {
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
74 val = strtoll(*toys.optargs, &ep, 0);
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
75 if (errno || (ep && (*ep != '\0' || ep == *toys.optargs))) {
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
76 perror_msg("Invalid num %s", *toys.optargs);
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
77 val = 0;
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
78 }
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
79 }
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
80 }
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
81 format = get_format(fmt);
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
82 TT.hv_w ? (TT.hv_p ? printf(format, w, p, val) : printf(format, w, val))
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
83 : (TT.hv_p ? printf(format, p, val) : printf(format, val));
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
84 break;
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
85 case 'g': /*FALL_THROUGH*/
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
86 case 'e': /*FALL_THROUGH*/
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
87 case 'E': /*FALL_THROUGH*/
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
88 case 'G': /*FALL_THROUGH*/
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
89 case 'f':
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
90 if (*toys.optargs) {
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
91 dval = strtold(*toys.optargs, &ep);
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
92 if (errno || (ep && (*ep != '\0' || ep == *toys.optargs))) {
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
93 perror_msg("Invalid num %s", *toys.optargs);
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
94 dval = 0;
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
95 }
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
96 } else dval = 0;
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
97 format = get_format(fmt);
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
98 TT.hv_w ? (TT.hv_p ? printf(format, w, p, dval):printf(format, w, dval))
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
99 : (TT.hv_p ? printf(format, p, dval) : printf(format, dval));
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
100 break;
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
101 case 's':
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
102 {
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
103 char *str = (*toys.optargs ? *toys.optargs : "");
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
104 TT.hv_w ? (TT.hv_p ? printf(fmt,w,p,str): printf(fmt, w, str))
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
105 : (TT.hv_p ? printf(fmt, p, str) : printf(fmt, str));
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
106 }
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
107 break;
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
108 case 'c':
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
109 printf(fmt, (*toys.optargs ? **toys.optargs : '\0'));
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
110 break;
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
111 }
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
112 if (format) free(format);
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
113 }
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
114
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
115 // Handle the escape sequences.
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
116 static int handle_slash(char **esc_val)
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
117 {
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
118 char *ptr = *esc_val;
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
119 int esc_length = 0;
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
120 unsigned base = 0, num = 0, result = 0, count = 0;
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
121
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
122 /*
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
123 * Hex escape sequence have only 1 or 2 digits, xHH. Oct escape sequence
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
124 * have 1,2 or 3 digits, xHHH. Leading "0" (\0HHH) we are ignoring.
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
125 */
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
126 if (*ptr == 'x') {
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
127 ptr++;
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
128 esc_length++;
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
129 base = 16;
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
130 } else if (isdigit(*ptr)) base = 8;
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
131
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
132 while (esc_length < 3 && base) {
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
133 num = tolower(*ptr) - '0';
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
134 if (num > 10) num += ('0' - 'a' + 10);
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
135 if (num >= base) {
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
136 if (base == 16) {
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
137 esc_length--;
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
138 if (!esc_length) {// Invalid hex value eg. /xvd, print as it is /xvd
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
139 result = '\\';
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
140 ptr--;
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
141 }
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
142 }
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
143 break;
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
144 }
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
145 esc_length++;
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
146 count = result = (count * base) + num;
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
147 ptr++;
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
148 }
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
149 if (base) {
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
150 ptr--;
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
151 *esc_val = ptr;
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
152 return (char)result;
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
153 } else {
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
154 switch (*ptr) {
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
155 case 'n': result = '\n'; break;
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
156 case 't': result = '\t'; break;
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
157 case 'e': result = (char)27; break;
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
158 case 'b': result = '\b'; break;
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
159 case 'a': result = '\a'; break;
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
160 case 'f': result = '\f'; break;
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
161 case 'v': result = '\v'; break;
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
162 case 'r': result = '\r'; break;
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
163 case '\\': result = '\\'; break;
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
164 default :
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
165 result = '\\';
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
166 ptr--; // Let pointer pointing to / we will increment after returning.
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
167 break;
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
168 }
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
169 }
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
170 *esc_val = ptr;
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
171 return (char)result;
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
172 }
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
173
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
174 // Handle "%b" option with '\' interpreted.
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
175 static void print_esc_str(char *str)
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
176 {
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
177 for (; *str; str++) {
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
178 if (*str == '\\') {
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
179 str++;
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
180 xputc(handle_slash(&str)); //print corresponding char
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
181 } else xputc(*str);
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
182 }
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
183 }
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
184
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
185 // Prase the format string and print.
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
186 static void parse_print(char *f)
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
187 {
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
188 char *start, *p, format_specifiers[] = "diouxXfeEgGcs";
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
189 int len = 0, width = 0, prec = 0;
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
190
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
191 while (*f) {
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
192 switch (*f) {
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
193 case '%':
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
194 start = f++;
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
195 len++;
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
196 if (*f == '%') {
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
197 xputc('%');
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
198 break;
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
199 }
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
200 if (*f == 'b') {
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
201 if (*toys.optargs) {
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
202 print_esc_str(*toys.optargs++);
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
203 TT.encountered = 1;
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
204 } else print_esc_str("");
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
205 break;
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
206 }
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
207 if (strchr("-+# ", *f)) f++, len++;
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
208 if (*f == '*') {
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
209 f++, len++;
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
210 if (*toys.optargs) {
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
211 width = get_w_p();
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
212 toys.optargs++;
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
213 }
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
214 } else {
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
215 while (isdigit(*f)) f++, len++;
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
216 }
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
217 if (*f == '.') {
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
218 f++, len++;
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
219 if (*f == '*') {
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
220 f++, len++;
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
221 if (*toys.optargs) {
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
222 prec = get_w_p();
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
223 toys.optargs++;
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
224 }
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
225 } else {
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
226 while (isdigit(*f)) f++, len++;
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
227 }
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
228 }
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
229 if (!(p = strchr(format_specifiers, *f)))
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
230 perror_exit("Missing OR Invalid format specifier");
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
231 else {
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
232 len++;
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
233 TT.hv_p = strstr(start, ".*");
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
234 TT.hv_w = strchr(start, '*');
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
235 //pitfall: handle diff b/w * and .*
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
236 if ((TT.hv_w-1) == TT.hv_p) TT.hv_w = NULL;
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
237 memcpy((p = xzalloc(len+1)), start, len);
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
238 print(p, width, prec, len);
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
239 if (*toys.optargs) toys.optargs++;
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
240 free(p);
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
241 p = NULL;
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
242 }
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
243 TT.encountered = 1;
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
244 break;
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
245 case '\\':
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
246 if (f[1]) {
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
247 if (*++f == 'c') exit(0); //Got '\c', so no further output
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
248 xputc(handle_slash(&f));
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
249 } else xputc(*f);
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
250 break;
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
251 default:
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
252 xputc(*f);
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
253 break;
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
254 }
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
255 f++;
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
256 len = 0;
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
257 }
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
258 }
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
259
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
260 void printf_main(void)
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
261 {
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
262 char *format = *toys.optargs++;
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
263
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
264 TT.encountered = 0;
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
265 parse_print(format); //printf acc. to format.
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
266 //Re-use FORMAT arg as necessary to convert all given ARGS.
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
267 while (*toys.optargs && TT.encountered) parse_print(format);
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
268 xflush();
2fe64bc16a61 An implementation of __printf__ is attached.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
269 }