]> ncurses.scripts.mit.edu Git - ncurses.git/blobdiff - progs/tabs.c
ncurses 5.9 - patch 20121117
[ncurses.git] / progs / tabs.c
index e0e042b3e5223adf0775738926a71cbe5e5779fb..bded0b04b259812db51be662d6305ac4a7dbc00c 100644 (file)
@@ -1,5 +1,5 @@
 /****************************************************************************
- * Copyright (c) 2008-2010,2011 Free Software Foundation, Inc.              *
+ * Copyright (c) 2008-2011,2012 Free Software Foundation, Inc.              *
  *                                                                          *
  * Permission is hereby granted, free of charge, to any person obtaining a  *
  * copy of this software and associated documentation files (the            *
 #define USE_LIBTINFO
 #include <progs.priv.h>
 
-MODULE_ID("$Id: tabs.c,v 1.20 2011/05/14 22:34:36 tom Exp $")
+MODULE_ID("$Id: tabs.c,v 1.25 2012/11/18 01:21:47 tom Exp $")
 
 static void usage(void) GCC_NORETURN;
 
 static int max_cols;
 
+static void
+failed(const char *s)
+{
+    perror(s);
+    ExitProgram(EXIT_FAILURE);
+}
+
 static int
 putch(int c)
 {
@@ -83,28 +90,29 @@ decode_tabs(const char *tab_list)
     int prior = 0;
     int ch;
 
-    if (result != 0) {
-       while ((ch = *tab_list++) != '\0') {
-           if (isdigit(UChar(ch))) {
-               value *= 10;
-               value += (ch - '0');
-           } else if (ch == ',') {
-               result[n] = value + prior;
-               if (n > 0 && result[n] <= result[n - 1]) {
-                   fprintf(stderr,
-                           "tab-stops are not in increasing order: %d %d\n",
-                           value, result[n - 1]);
-                   free(result);
-                   result = 0;
-                   break;
-               }
-               ++n;
-               value = 0;
-               prior = 0;
-           } else if (ch == '+') {
-               if (n)
-                   prior = result[n - 1];
+    if (result == 0)
+       failed("decode_tabs");
+
+    while ((ch = *tab_list++) != '\0') {
+       if (isdigit(UChar(ch))) {
+           value *= 10;
+           value += (ch - '0');
+       } else if (ch == ',') {
+           result[n] = value + prior;
+           if (n > 0 && result[n] <= result[n - 1]) {
+               fprintf(stderr,
+                       "tab-stops are not in increasing order: %d %d\n",
+                       value, result[n - 1]);
+               free(result);
+               result = 0;
+               break;
            }
+           ++n;
+           value = 0;
+           prior = 0;
+       } else if (ch == '+') {
+           if (n)
+               prior = result[n - 1];
        }
     }
 
@@ -126,6 +134,7 @@ decode_tabs(const char *tab_list)
        result[n++] = value + prior;
        result[n] = 0;
     }
+
     return result;
 }
 
@@ -140,10 +149,11 @@ print_ruler(int *tab_list)
     for (n = 0; n < max_cols; n += 10) {
        int ch = 1 + (n / 10);
        char buffer[20];
-       sprintf(buffer, "----+----%c",
-               ((ch < 10)
-                ? (ch + '0')
-                : (ch + 'A' - 10)));
+       _nc_SPRINTF(buffer, _nc_SLIMIT(sizeof(buffer))
+                   "----+----%c",
+                   ((ch < 10)
+                    ? (ch + '0')
+                    : (ch + 'A' - 10)));
        printf("%.*s", ((max_cols - n) > 10) ? 10 : (max_cols - n), buffer);
     }
     putchar('\n');
@@ -263,15 +273,16 @@ add_to_tab_list(char **append, const char *value)
            need += strlen(*append);
 
        result = malloc(need);
-       if (result != 0) {
-           *result = '\0';
-           if (*append != 0) {
-               strcpy(result, *append);
-               free(*append);
-           }
-           strcat(result, comma);
-           strcat(result, copied);
+       if (result == 0)
+           failed("add_to_tab_list");
+
+       *result = '\0';
+       if (*append != 0) {
+           _nc_STRCPY(result, *append, need);
+           free(*append);
        }
+       _nc_STRCAT(result, comma, need);
+       _nc_STRCAT(result, copied, need);
 
        *append = result;
     }
@@ -353,7 +364,6 @@ main(int argc, char *argv[])
     bool no_op = FALSE;
     int n, ch;
     NCURSES_CONST char *term_name = 0;
-    const char *mar_list = 0;  /* ignored */
     char *append = 0;
     const char *tab_list = 0;
 
@@ -446,7 +456,11 @@ main(int argc, char *argv[])
            while ((ch = *++option) != '\0') {
                switch (ch) {
                case 'm':
-                   mar_list = option;
+                   /*
+                    * The "+mXXX" option is unimplemented because only the long-obsolete
+                    * att510d implements smgl, which is needed to support
+                    * this option.
+                    */
                    break;
                default:
                    /* special case of relative stops separated by spaces? */