Part of Slepp's ProjectsPastebinTURLImagebinFilebin
Feedback -- English French German Japanese
Create Upload Newest Tools Donate

Advertising

Stuff
Thursday, October 14th, 2010 at 1:51:40am UTC 

  1. --- /tmp/p.c    Wed Oct 13 18:49:04 2010
  2. +++ printf.c    Wed Oct 13 18:47:43 2010
  3. @@ -1,4 +1,5 @@
  4.  /*
  5. + * Copyright 2010 Nexenta Systems, Inc.  All rights reserved.
  6.   * Copyright (c) 1989, 1993
  7.   *     The Regents of the University of California.  All rights reserved.
  8.   *
  9. @@ -10,10 +11,6 @@
  10.   * 2. Redistributions in binary form must reproduce the above copyright
  11.   *    notice, this list of conditions and the following disclaimer in the
  12.   *    documentation and/or other materials provided with the distribution.
  13. - * 3. All advertising materials mentioning features or use of this software
  14. - *    must display the following acknowledgement:
  15. - *     This product includes software developed by the University of
  16. - *     California, Berkeley and its contributors.
  17.   * 4. Neither the name of the University nor the names of its contributors
  18.   *    may be used to endorse or promote products derived from this software
  19.   *    without specific prior written permission.
  20. @@ -31,22 +28,6 @@
  21.   * SUCH DAMAGE.
  22.   */
  23.  
  24. -#if !defined(BUILTIN) && !defined(SHELL)
  25. -#ifndef lint
  26. -static char const copyright[] =
  27. -"@(#) Copyright (c) 1989, 1993\n\
  28. -       The Regents of the University of California.  All rights reserved.\n";
  29. -#endif /* not lint */
  30. -#endif
  31. -
  32. -#ifndef lint
  33. -#if 0
  34. -static char const sccsid[] = "@(#)printf.c     8.1 (Berkeley) 7/20/93";
  35. -#endif
  36. -static const char rcsid[] =
  37. -  "$FreeBSD$";
  38. -#endif /* not lint */
  39. -
  40.  #include <sys/types.h>
  41.  
  42.  #include <err.h>
  43. @@ -57,36 +38,36 @@
  44.  #include <stdlib.h>
  45.  #include <string.h>
  46.  #include <unistd.h>
  47. +#include <locale.h>
  48.  
  49. -#ifdef SHELL
  50. -#define main printfcmd
  51. -#include "bltin/bltin.h"
  52. -#include "memalloc.h"
  53. -#else
  54.  #define        warnx1(a, b, c)  warnx(a)
  55.  #define        warnx2(a, b, c)  warnx(a, b)
  56.  #define        warnx3(a, b, c)  warnx(a, b, c)
  57. -#endif
  58.  
  59. -#ifndef BUILTIN
  60. -#include <locale.h>
  61. -#endif
  62. +#define        _(x)    gettext(x)
  63.  
  64. -#define PF(f, func) do { \
  65. -       char *b = NULL; \
  66. -       if (havewidth) \
  67. -              if (haveprec) \
  68. -                     (void)asprintf(&b, f, fieldwidth, precision, func); \
  69. -              else \
  70. -                     (void)asprintf(&b, f, fieldwidth, func); \
  71. -       else if (haveprec) \
  72. -              (void)asprintf(&b, f, precision, func); \
  73. -       else \
  74. -              (void)asprintf(&b, f, func); \
  75. -       if (b) { \
  76. -              (void)fputs(b, stdout); \
  77. -              free(b); \
  78. -       } \
  79. +#define        PF(f, func) do {                                                \
  80. +       char *b = NULL;                                                        \
  81. +       int dollar = 0;                                                        \
  82. +       if (*f == '$')         {                                          \
  83. +              dollar++;                                    \
  84. +              *f = '%';                                    \
  85. +       }                                         \
  86. +       if (havewidth)       \
  87. +              if (haveprec)            \
  88. +                     (void) asprintf(&b, f, fieldwidth, precision, func); \
  89. +              else                     \
  90. +                     (void) asprintf(&b, f, fieldwidth, func);      \
  91. +       else if (haveprec)                              \
  92. +              (void) asprintf(&b, f, precision, func);              \
  93. +       else                        \
  94. +              (void) asprintf(&b, f, func);        \
  95. +       if (b) {                                                 \
  96. +              (void) fputs(b, stdout);                            \
  97. +              free(b);                                          \
  98. +       }                                                \
  99. +       if (dollar)                            \
  100. +              *f = '$';                                    \
  101.  } while (0)
  102.  
  103.  static int      asciicode(void);
  104. @@ -98,35 +79,25 @@
  105.  static int      getnum(intmax_t *, uintmax_t *, int);
  106.  static const char
  107.                *getstr(void);
  108. -static char    *mknum(char *, int);
  109. +static char    *mknum(char *, char);
  110.  static void     usage(void);
  111.  
  112. +static int  myargc;
  113. +static char **myargv;
  114.  static char **gargv;
  115.  
  116.  int
  117. -#ifdef BUILTIN
  118. -progprintf(int argc, char *argv[])
  119. -#else
  120.  main(int argc, char *argv[])
  121. -#endif
  122.  {
  123.         size_t len;
  124. -       int ch, chopped, end, rval;
  125. +       int chopped, end, rval;
  126.         char *format, *fmt, *start;
  127.  
  128. -#ifndef BUILTIN
  129. -       (void) setlocale(LC_NUMERIC, "");
  130. -#endif
  131. -       while ((ch = getopt(argc, argv, "")) != -1)
  132. -              switch (ch) {
  133. -              case '?':
  134. -              default:
  135. -                     usage();
  136. -                     return (1);
  137. -              }
  138. -       argc -= optind;
  139. -       argv += optind;
  140. +       (void) setlocale(LC_ALL, "");
  141.  
  142. +       argv++;
  143. +       argc--;
  144. +
  145.         if (argc < 1) {
  146.                usage();
  147.                return (1);
  148. @@ -144,14 +115,21 @@
  149.         chopped = escape(fmt, 1, &len);                /* backslash interpretation */
  150.         rval = end = 0;
  151.         gargv = ++argv;
  152. +
  153.         for (;;) {
  154. +              char **maxargv = gargv;
  155. +
  156. +              myargv = gargv;
  157. +              for (myargc = 0; gargv[myargc]; myargc++)
  158. +                     /* nop */;
  159.                start = fmt;
  160.                while (fmt < format + len) {
  161.                       if (fmt[0] == '%') {
  162. -                            fwrite(start, 1, fmt - start, stdout);
  163. +                            (void) fwrite(start, 1,
  164. +                                (uintptr_t)fmt - (uintptr_t)start, stdout);
  165.                              if (fmt[1] == '%') {
  166.                                     /* %% prints a % */
  167. -                                   putchar('%');
  168. +                                   (void) putchar('%');
  169.                                     fmt += 2;
  170.                              } else {
  171.                                     fmt = doformat(fmt, &rval);
  172. @@ -162,13 +140,17 @@
  173.                              start = fmt;
  174.                       } else
  175.                              fmt++;
  176. +                     if (gargv > maxargv)
  177. +                            maxargv = gargv;
  178.                }
  179. +              gargv = maxargv;
  180.  
  181.                if (end == 1) {
  182. -                     warnx1("missing format character", NULL, NULL);
  183. +                     warnx1(_("missing format character"), NULL, NULL);
  184.                       return (1);
  185.                }
  186. -              fwrite(start, 1, fmt - start, stdout);
  187. +              (void) fwrite(start, 1, (uintptr_t)fmt - (uintptr_t)start,
  188. +                  stdout);
  189.                if (chopped || !*gargv)
  190.                       return (rval);
  191.                /* Restart at the beginning of the format string. */
  192. @@ -189,6 +171,22 @@
  193.         char convch, nextch;
  194.  
  195.         fmt = start + 1;
  196. +
  197. +       /* look for "n$" field index specifier */
  198. +       fmt += strspn(fmt, skip2);
  199. +       if ((*fmt == '$') && (fmt != (start + 1))) {
  200. +              int idx = atoi(start + 1);
  201. +              if (idx <= myargc) {
  202. +                     gargv = &myargv[idx - 1];
  203. +              } else {
  204. +                     gargv = &myargv[myargc];
  205. +              }
  206. +              start = fmt;
  207. +              fmt++;
  208. +       } else {
  209. +              fmt = start + 1;
  210. +       }
  211. +
  212.         /* skip to field width */
  213.         fmt += strspn(fmt, skip1);
  214.         if (*fmt == '*') {
  215. @@ -219,7 +217,7 @@
  216.         } else
  217.                haveprec = 0;
  218.         if (!*fmt) {
  219. -              warnx1("missing format character", NULL, NULL);
  220. +              warnx1(_("missing format character"), NULL, NULL);
  221.                return (NULL);
  222.         }
  223.  
  224. @@ -237,7 +235,7 @@
  225.                mod_ldbl = 1;
  226.                fmt++;
  227.                if (!strchr("aAeEfFgG", *fmt)) {
  228. -                     warnx2("bad modifier L for %%%c", *fmt, NULL);
  229. +                     warnx2(_("bad modifier L for %%%c"), *fmt, NULL);
  230.                       return (NULL);
  231.                }
  232.         } else {
  233. @@ -253,11 +251,7 @@
  234.                char *p;
  235.                int getout;
  236.  
  237. -#ifdef SHELL
  238. -              p = savestr(getstr());
  239. -#else
  240.                p = strdup(getstr());
  241. -#endif
  242.                if (p == NULL) {
  243.                       warnx2("%s", strerror(ENOMEM), NULL);
  244.                       return (NULL);
  245. @@ -264,13 +258,11 @@
  246.                }
  247.                getout = escape(p, 0, &len);
  248.                *(fmt - 1) = 's';
  249. +              /*LINTED E_CONST_CONDITION*/
  250.                PF(start, p);
  251.                *(fmt - 1) = 'b';
  252. -#ifdef SHELL
  253. -              ckfree(p);
  254. -#else
  255.                free(p);
  256. -#endif
  257. +
  258.                if (getout)
  259.                       return (fmt);
  260.                break;
  261. @@ -279,6 +271,7 @@
  262.                char p;
  263.  
  264.                p = getchr();
  265. +              /*LINTED E_CONST_CONDITION*/
  266.                PF(start, p);
  267.                break;
  268.         }
  269. @@ -286,6 +279,7 @@
  270.                const char *p;
  271.  
  272.                p = getstr();
  273. +              /*LINTED E_CONST_CONDITION*/
  274.                PF(start, p);
  275.                break;
  276.         }
  277. @@ -301,8 +295,10 @@
  278.                if (getnum(&val, &uval, signedconv))
  279.                       *rval = 1;
  280.                if (signedconv)
  281. +                     /*LINTED E_CONST_CONDITION*/
  282.                       PF(f, val);
  283.                else
  284. +                     /*LINTED E_CONST_CONDITION*/
  285.                       PF(f, uval);
  286.                break;
  287.         }
  288. @@ -315,13 +311,15 @@
  289.                if (getfloating(&p, mod_ldbl))
  290.                       *rval = 1;
  291.                if (mod_ldbl)
  292. +                     /*LINTED E_CONST_CONDITION*/
  293.                       PF(start, p);
  294.                else
  295. +                     /*LINTED E_CONST_CONDITION*/
  296.                       PF(start, (double)p);
  297.                break;
  298.         }
  299.         default:
  300. -              warnx2("illegal format character %c", convch, NULL);
  301. +              warnx2(_("illegal format character %c"), convch, NULL);
  302.                return (NULL);
  303.         }
  304.         *fmt = nextch;
  305. @@ -329,7 +327,7 @@
  306.  }
  307.  
  308.  static char *
  309. -mknum(char *str, int ch)
  310. +mknum(char *str, char ch)
  311.  {
  312.         static char *copy;
  313.         static size_t copy_size;
  314. @@ -339,12 +337,7 @@
  315.         len = strlen(str) + 2;
  316.         if (len > copy_size) {
  317.                newlen = ((len + 1023) >> 10) << 10;
  318. -#ifdef SHELL
  319. -              if ((newcopy = ckrealloc(copy, newlen)) == NULL)
  320. -#else
  321. -              if ((newcopy = realloc(copy, newlen)) == NULL)
  322. -#endif
  323. -              {
  324. +              if ((newcopy = realloc(copy, newlen)) == NULL) {
  325.                       warnx2("%s", strerror(ENOMEM), NULL);
  326.                       return (NULL);
  327.                }
  328. @@ -352,7 +345,7 @@
  329.                copy_size = newlen;
  330.         }
  331.  
  332. -       memmove(copy, str, len - 3);
  333. +       (void) memmove(copy, str, len - 3);
  334.         copy[len - 3] = 'j';
  335.         copy[len - 2] = ch;
  336.         copy[len - 1] = '\0';
  337. @@ -362,10 +355,10 @@
  338.  static int
  339.  escape(char *fmt, int percent, size_t *len)
  340.  {
  341. -       char *save, *store;
  342. -       int value, c;
  343. +       char *save, *store, c;
  344. +       int value;
  345.  
  346. -       for (save = store = fmt; (c = *fmt); ++fmt, ++store) {
  347. +       for (save = store = fmt; ((c = *fmt) != 0); ++fmt, ++store) {
  348.                if (c != '\\') {
  349.                       *store = c;
  350.                       continue;
  351. @@ -374,7 +367,7 @@
  352.                case '\0':          /* EOS, user error */
  353.                       *store = '\\';
  354.                       *++store = '\0';
  355. -                     *len = store - save;
  356. +                     *len = (uintptr_t)store - (uintptr_t)save;
  357.                       return (0);
  358.                case '\\':          /* backslash */
  359.                case '\'':          /* single quote */
  360. @@ -388,7 +381,7 @@
  361.                       break;
  362.                case 'c':
  363.                       *store = '\0';
  364. -                     *len = store - save;
  365. +                     *len = (uintptr_t)store - (uintptr_t)save;
  366.                       return (1);
  367.                case 'f':            /* form-feed */
  368.                       *store = '\f';
  369. @@ -419,7 +412,7 @@
  370.                              *store++ = '%';
  371.                              *store = '%';
  372.                       } else
  373. -                            *store = value;
  374. +                            *store = (char)value;
  375.                       break;
  376.                default:
  377.                       *store = *fmt;
  378. @@ -427,7 +420,7 @@
  379.                }
  380.         }
  381.         *store = '\0';
  382. -       *len = store - save;
  383. +       *len = (uintptr_t)store - (uintptr_t)save;
  384.         return (0);
  385.  }
  386.  
  387. @@ -489,15 +482,14 @@
  388.         else
  389.                *uip = strtoumax(*gargv, &ep, 0);
  390.         if (ep == *gargv) {
  391. -              warnx2("%s: expected numeric value", *gargv, NULL);
  392. +              warnx2(_("%s: expected numeric value"), *gargv, NULL);
  393.                rval = 1;
  394. -       }
  395. -       else if (*ep != '\0') {
  396. -              warnx2("%s: not completely converted", *gargv, NULL);
  397. +       } else if (*ep != '\0') {
  398. +              warnx2(_("%s: not completely converted"), *gargv, NULL);
  399.                rval = 1;
  400.         }
  401.         if (errno == ERANGE) {
  402. -              warnx3("%s: %s", *gargv, strerror(ERANGE));
  403. +              warnx3(_("%s: %s"), *gargv, strerror(ERANGE));
  404.                rval = 1;
  405.         }
  406.         ++gargv;
  407. @@ -525,10 +517,10 @@
  408.         else
  409.                *dp = strtod(*gargv, &ep);
  410.         if (ep == *gargv) {
  411. -              warnx2("%s: expected numeric value", *gargv, NULL);
  412. +              warnx2(_("%s: expected numeric value"), *gargv, NULL);
  413.                rval = 1;
  414.         } else if (*ep != '\0') {
  415. -              warnx2("%s: not completely converted", *gargv, NULL);
  416. +              warnx2(_("%s: not completely converted"), *gargv, NULL);
  417.                rval = 1;
  418.         }
  419.         if (errno == ERANGE) {
  420. @@ -554,5 +546,5 @@
  421.  static void
  422.  usage(void)
  423.  {
  424. -       (void)fprintf(stderr, "usage: printf format [arguments ...]\n");
  425. +       (void) fprintf(stderr, _("usage: printf format [arguments ...]\n"));
  426.  }

advertising

Update the Post

Either update this post and resubmit it with changes, or make a new post.

You may also comment on this post.

update paste below
details of the post (optional)

Note: Only the paste content is required, though the following information can be useful to others.

Save name / title?

(space separated, optional)



Please note that information posted here will not expire by default. If you do not want it to expire, please set the expiry time above. If it is set to expire, web search engines will not be allowed to index it prior to it expiring. Items that are not marked to expire will be indexable by search engines. Be careful with your passwords. All illegal activities will be reported and any information will be handed over to the authorities, so be good.

comments powered by Disqus