ncurses 5.9 - patch 20120317
[ncurses.git] / progs / tabs.c
index f3cc42fb7b009d9319668950ebd4ac27ac1132f5..88bbf2edb92cfc964de86c9c7cb44e43562682b9 100644 (file)
@@ -1,5 +1,5 @@
 /****************************************************************************
 /****************************************************************************
- * Copyright (c) 2008 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            *
  *                                                                          *
  * Permission is hereby granted, free of charge, to any person obtaining a  *
  * copy of this software and associated documentation files (the            *
@@ -37,7 +37,7 @@
 #define USE_LIBTINFO
 #include <progs.priv.h>
 
 #define USE_LIBTINFO
 #include <progs.priv.h>
 
-MODULE_ID("$Id: tabs.c,v 1.15 2008/11/23 00:47:51 tom Exp $")
+MODULE_ID("$Id: tabs.c,v 1.23 2012/02/22 23:57:44 tom Exp $")
 
 static void usage(void) GCC_NORETURN;
 
 
 static void usage(void) GCC_NORETURN;
 
@@ -90,9 +90,10 @@ decode_tabs(const char *tab_list)
                value += (ch - '0');
            } else if (ch == ',') {
                result[n] = value + prior;
                value += (ch - '0');
            } else if (ch == ',') {
                result[n] = value + prior;
-               if (n > 0 && value <= result[n - 1]) {
+               if (n > 0 && result[n] <= result[n - 1]) {
                    fprintf(stderr,
                    fprintf(stderr,
-                           "tab-stops are not in increasing order\n");
+                           "tab-stops are not in increasing order: %d %d\n",
+                           value, result[n - 1]);
                    free(result);
                    result = 0;
                    break;
                    free(result);
                    result = 0;
                    break;
@@ -122,7 +123,7 @@ decode_tabs(const char *tab_list)
        /*
         * Add the last value, if any.
         */
        /*
         * Add the last value, if any.
         */
-       result[n++] = value;
+       result[n++] = value + prior;
        result[n] = 0;
     }
     return result;
        result[n] = 0;
     }
     return result;
@@ -139,10 +140,11 @@ print_ruler(int *tab_list)
     for (n = 0; n < max_cols; n += 10) {
        int ch = 1 + (n / 10);
        char buffer[20];
     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');
        printf("%.*s", ((max_cols - n) > 10) ? 10 : (max_cols - n), buffer);
     }
     putchar('\n');
@@ -210,8 +212,8 @@ trimmed_tab_list(const char *source)
                ;
            } else {
                if (last == ',')
                ;
            } else {
                if (last == ',')
-                   result[k++] = last;
-               result[k++] = ch;
+                   result[k++] = (char) last;
+               result[k++] = (char) ch;
            }
            last = ch;
        }
            }
            last = ch;
        }
@@ -226,7 +228,7 @@ comma_is_needed(const char *source)
     bool result = FALSE;
 
     if (source != 0) {
     bool result = FALSE;
 
     if (source != 0) {
-       unsigned len = strlen(source);
+       size_t len = strlen(source);
        if (len != 0)
            result = (source[len - 1] != ',');
     } else {
        if (len != 0)
            result = (source[len - 1] != ',');
     } else {
@@ -250,7 +252,7 @@ add_to_tab_list(char **append, const char *value)
 
     if (copied != 0 && *copied != '\0') {
        const char *comma = ",";
 
     if (copied != 0 && *copied != '\0') {
        const char *comma = ",";
-       unsigned need = 1 + strlen(copied);
+       size_t need = 1 + strlen(copied);
 
        if (*copied == ',')
            comma = "";
 
        if (*copied == ',')
            comma = "";
@@ -265,11 +267,11 @@ add_to_tab_list(char **append, const char *value)
        if (result != 0) {
            *result = '\0';
            if (*append != 0) {
        if (result != 0) {
            *result = '\0';
            if (*append != 0) {
-               strcpy(result, *append);
+               _nc_STRCPY(result, *append, need);
                free(*append);
            }
                free(*append);
            }
-           strcat(result, comma);
-           strcat(result, copied);
+           _nc_STRCAT(result, comma, need);
+           _nc_STRCAT(result, copied, need);
        }
 
        *append = result;
        }
 
        *append = result;
@@ -290,7 +292,7 @@ legal_tab_list(const char *program, const char *tab_list)
            int n, ch;
            for (n = 0; tab_list[n] != '\0'; ++n) {
                ch = UChar(tab_list[n]);
            int n, ch;
            for (n = 0; tab_list[n] != '\0'; ++n) {
                ch = UChar(tab_list[n]);
-               if (!(isdigit(ch) || ch == ',')) {
+               if (!(isdigit(ch) || ch == ',' || ch == '+')) {
                    fprintf(stderr,
                            "%s: unexpected character found '%c'\n",
                            program, ch);
                    fprintf(stderr,
                            "%s: unexpected character found '%c'\n",
                            program, ch);
@@ -352,7 +354,6 @@ main(int argc, char *argv[])
     bool no_op = FALSE;
     int n, ch;
     NCURSES_CONST char *term_name = 0;
     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;
 
     char *append = 0;
     const char *tab_list = 0;
 
@@ -445,10 +446,18 @@ main(int argc, char *argv[])
            while ((ch = *++option) != '\0') {
                switch (ch) {
                case 'm':
            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:
                    break;
                default:
-                   usage();
+                   /* special case of relative stops separated by spaces? */
+                   if (option == argv[n] + 1) {
+                       tab_list = add_to_tab_list(&append, argv[n]);
+                   }
+                   break;
                }
            }
            break;
                }
            }
            break;
@@ -461,7 +470,6 @@ main(int argc, char *argv[])
                }
            }
            tab_list = add_to_tab_list(&append, option);
                }
            }
            tab_list = add_to_tab_list(&append, option);
-           option += ((int) strlen(option)) - 1;
            break;
        }
     }
            break;
        }
     }