]> diplodocus.org Git - nmh/blobdiff - sbr/utils.c
NEWS: Move "new features" that might bite a user to the top.
[nmh] / sbr / utils.c
index 8bd84c39cd07563c4c8d4d8a9976b8257e37e3ce..90f36bd340ef8cfd9eab9aed71f71a0b68e2f6d1 100644 (file)
@@ -11,6 +11,7 @@
 #include "m_mktemp.h"
 #include "makedir.h"
 #include <fcntl.h>
 #include "m_mktemp.h"
 #include "makedir.h"
 #include <fcntl.h>
+#include <limits.h>
 
 extern char *mhdocdir;
 
 
 extern char *mhdocdir;
 
@@ -267,22 +268,6 @@ app_msgnum(struct msgnum_array *msgs, int msgnum)
        msgs->msgnums[msgs->size++] = msgnum;
 }
 
        msgs->msgnums[msgs->size++] = msgnum;
 }
 
-/* Open a form or components file */
-int
-open_form(char **form, char *def)
-{
-       int in;
-       if (*form) {
-               if ((in = open (etcpath (*form), O_RDONLY)) == NOTOK)
-                       adios (*form, "unable to open form file");
-       } else {
-               if ((in = open (etcpath (def), O_RDONLY)) == NOTOK)
-                       adios (def, "unable to open default components file");
-               *form = def;
-       }
-       return in;
-}
-
 
 /*
  * Finds first occurrence of str in buf.  buf is not a C string but a
 
 /*
  * Finds first occurrence of str in buf.  buf is not a C string but a
@@ -577,7 +562,7 @@ scan_input (int fd, int *eightbit) {
     char buf[BUFSIZ];
 
     *eightbit = 0;
     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)) {
 
     while ((state = read (fd, buf, sizeof buf)) > 0) {
         if (contains8bit (buf, buf + state)) {
@@ -588,3 +573,32 @@ scan_input (int fd, int *eightbit) {
 
     return state == NOTOK  ?  NOTOK  :  OK;
 }
 
     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
+        : "?";
+}