]> diplodocus.org Git - nmh/blobdiff - sbr/utils.c
m_getfld.c: Alter Peek() to match Getc()'s structure.
[nmh] / sbr / utils.c
index f9bb5a97d23af195d3ce24759c57a5c202e31f92..205c859240ed690c1b1c09cdcf30977d220f1117 100644 (file)
@@ -11,6 +11,7 @@
 #include "m_mktemp.h"
 #include "makedir.h"
 #include <fcntl.h>
+#include <limits.h>
 
 extern char *mhdocdir;
 
@@ -34,7 +35,7 @@ void *mh_xmalloc(size_t size)
         size = 1; /* Some mallocs don't like 0. */
     p = malloc(size);
     if (!p)
-        adios(NULL, "malloc failed, size wanted: %zu", size);
+        adios(NULL, "malloc failed, size wanted: %lu", (unsigned long)size);
 
     return p;
 }
@@ -54,7 +55,7 @@ void *mh_xrealloc(void *ptr, size_t size)
 
     new = realloc(ptr, size);
     if (!new)
-        adios(NULL, "realloc failed, size wanted: %zu", size);
+        adios(NULL, "realloc failed, size wanted: %lu", (unsigned long)size);
 
     return new;
 }
@@ -69,7 +70,8 @@ void *mh_xcalloc(size_t nelem, size_t elsize)
 
     p = calloc(nelem, elsize);
     if (!p)
-        adios(NULL, "calloc failed, size wanted: %zu * %zu", nelem, elsize);
+        adios(NULL, "calloc failed, size wanted: %lu * %lu",
+            (unsigned long)nelem, (unsigned long)elsize);
 
     return p;
 }
@@ -561,7 +563,7 @@ scan_input (int fd, int *eightbit) {
     char buf[BUFSIZ];
 
     *eightbit = 0;
-    lseek (fd, (off_t) 0, SEEK_SET);
+    lseek(fd, 0, SEEK_SET);
 
     while ((state = read (fd, buf, sizeof buf)) > 0) {
         if (contains8bit (buf, buf + state)) {
@@ -572,3 +574,32 @@ scan_input (int fd, int *eightbit) {
 
     return state == NOTOK  ?  NOTOK  :  OK;
 }
+
+
+/*
+ * Convert an int to a char string.
+ */
+char *
+m_str(int value) {
+    return m_strn(value, 0);
+}
+
+
+/*
+ * Convert an int to a char string, of limited width if > 0.
+ */
+#define STR(s) #s
+/* SIZE(n) includes NUL.  n must just be digits, not an equation. */
+#define SIZE(n) (sizeof STR(n))
+
+char *
+m_strn(int value, unsigned int width) {
+    /* Need to include space for negative sign.  But don't use INT_MIN
+       because it could be a macro that would fool SIZE(n). */
+    static char buffer[SIZE(-INT_MAX)];
+    const int num_chars = snprintf(buffer, sizeof buffer, "%d", value);
+
+    return num_chars > 0  &&  (width == 0 || (unsigned int) num_chars <= width)
+        ? buffer
+        : "?";
+}