utils/macros.h: Add <ctype.h> and `foocmp' helper macros.
[mLib] / struct / dstr-putf.c
index 9ac8cf9..270f9a3 100644 (file)
@@ -32,7 +32,6 @@
 #include <assert.h>
 #include <ctype.h>
 #include <limits.h>
-#include <math.h>
 #include <stdarg.h>
 #include <stdio.h>
 #include <stdlib.h>
@@ -48,6 +47,7 @@
 
 #include "darray.h"
 #include "dstr.h"
+#include "macros.h"
 
 /*----- Tunable constants -------------------------------------------------*/
 
@@ -202,7 +202,7 @@ int dstr_vputf(dstr *d, const char *p, va_list *ap)
   /* --- Initial pass through the input, parsing format specifiers --- *
    *
    * We essentially compile the format string into a vector of @fmtspec@
-   * objects, each of which represnts a chunk of literal text followed by a
+   * objects, each of which represents a chunk of literal text followed by a
    * (possibly imaginary, in the case of the final one) formatting directive.
    * Output then simply consists of interpreting these specifiers in order.
    */
@@ -248,7 +248,7 @@ int dstr_vputf(dstr *d, const char *p, va_list *ap)
 
   done_flags:
     i = 0;
-    while (isdigit((unsigned char)*p)) i = 10*i + *p++ - '0';
+    while (ISDIGIT(*p)) i = 10*i + *p++ - '0';
 
     /* --- Snag: this might have been an argument position indicator --- */
 
@@ -270,11 +270,11 @@ int dstr_vputf(dstr *d, const char *p, va_list *ap)
       fs->wd = i;
     } else if (*p == '*') {
       p++;
-      if (!isdigit((unsigned char)*p))
+      if (!ISDIGIT(*p))
        i = anext++;
       else {
        i = *p++ - '0';
-       while (isdigit((unsigned char)*p)) i = 10*i + *p++ - '0';
+       while (ISDIGIT(*p)) i = 10*i + *p++ - '0';
        assert(*p == '$'); p++;
        assert(i > 0); i--;
       }
@@ -287,19 +287,19 @@ int dstr_vputf(dstr *d, const char *p, va_list *ap)
     if (*p == '.') {
       p++;
       f |= f_prec;
-      if (isdigit((unsigned char)*p)) {
+      if (ISDIGIT(*p)) {
        i = *p++ - '0';
-       while (isdigit((unsigned char)*p)) i = 10*i + *p++ - '0';
+       while (ISDIGIT(*p)) i = 10*i + *p++ - '0';
        fs->prec = i;
       } else if (*p != '*')
        fs->prec = 0;
       else {
        p++;
-       if (!isdigit((unsigned char)*p))
+       if (!ISDIGIT(*p))
          i = anext++;
        else {
          i = *p++ - '0';
-         while (isdigit((unsigned char)*p)) i = 10*i + *p++ - '0';
+         while (ISDIGIT(*p)) i = 10*i + *p++ - '0';
          assert(*p == '$'); p++;
          assert(i > 0); i--;
        }
@@ -536,6 +536,8 @@ int dstr_vputf(dstr *d, const char *p, va_list *ap)
 
   DPUTZ(d);
   DDESTROY(&dd);
+  DA_DESTROY(&av);
+  DA_DESTROY(&sv);
   return (d->len - n);
 }