Must count '*' characters as potential arguments.
authorTom Lane
Thu, 14 Apr 2005 20:53:09 +0000 (20:53 +0000)
committerTom Lane
Thu, 14 Apr 2005 20:53:09 +0000 (20:53 +0000)
src/port/snprintf.c

index 38034b519d3e563851e4367ab16d834224f7fea6..04a5eb58b249b88848419c2c4d5db9527c45a373 100644 (file)
@@ -62,7 +62,7 @@
  * causing nasty effects.
  **************************************************************/
 
-/*static char _id[] = "$PostgreSQL: pgsql/src/port/snprintf.c,v 1.26 2005/03/20 13:54:53 momjian Exp $";*/
+/*static char _id[] = "$PostgreSQL: pgsql/src/port/snprintf.c,v 1.27 2005/04/14 20:53:09 tgl Exp $";*/
 
 static void dopr(char *buffer, const char *format, va_list args, char *end);
 
@@ -194,7 +194,7 @@ dopr(char *buffer, const char *format, va_list args, char *end)
    int         precision;
    int         position;
    char       *output;
-   int         percents = 1;
+   int         nargs = 1;
    const char *p;
    struct fmtpar
    {
@@ -220,18 +220,22 @@ dopr(char *buffer, const char *format, va_list args, char *end)
        int         longlongflag;
    }          *fmtpar, **fmtparptr;
 
-   /* Create enough structures to hold all arguments */
+   /*
+    * Create enough structures to hold all arguments.  This overcounts,
+    * eg not all '*' characters are necessarily arguments, but it's not
+    * worth being exact.
+    */
    for (p = format; *p != '\0'; p++)
-       if (*p == '%')          /* counts %% as two, so overcounts */
-           percents++;
+       if (*p == '%' || *p == '*')
+           nargs++;
 
    /* Need to use malloc() because memory system might not be started yet. */
-   if ((fmtpar = malloc(sizeof(struct fmtpar) * percents)) == NULL)
+   if ((fmtpar = malloc(sizeof(struct fmtpar) * nargs)) == NULL)
    {
        fprintf(stderr, _("out of memory\n"));
        exit(1);
    }
-   if ((fmtparptr = malloc(sizeof(struct fmtpar *) * percents)) == NULL)
+   if ((fmtparptr = malloc(sizeof(struct fmtpar *) * nargs)) == NULL)
    {
        fprintf(stderr, _("out of memory\n"));
        exit(1);