X-Git-Url: https://ncurses.scripts.mit.edu/?p=ncurses.git;a=blobdiff_plain;f=progs%2Ftabs.c;h=88bbf2edb92cfc964de86c9c7cb44e43562682b9;hp=002a7531de08af3de16af0587ac59c752370f6d2;hb=beb0f0c6911096ee19815bdf2601c4317d80341f;hpb=92e187a3459ab7ce1613a3684ca6642447c73620 diff --git a/progs/tabs.c b/progs/tabs.c index 002a7531..88bbf2ed 100644 --- a/progs/tabs.c +++ b/progs/tabs.c @@ -1,5 +1,5 @@ /**************************************************************************** - * Copyright (c) 2008-2009,2010 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 * @@ -37,7 +37,7 @@ #define USE_LIBTINFO #include -MODULE_ID("$Id: tabs.c,v 1.17 2010/05/01 22:04:08 tom Exp $") +MODULE_ID("$Id: tabs.c,v 1.23 2012/02/22 23:57:44 tom Exp $") 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; - if (n > 0 && value <= result[n - 1]) { + if (n > 0 && result[n] <= result[n - 1]) { 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; @@ -122,7 +123,7 @@ decode_tabs(const char *tab_list) /* * Add the last value, if any. */ - result[n++] = value; + result[n++] = value + prior; 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]; - 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'); @@ -226,7 +228,7 @@ comma_is_needed(const char *source) bool result = FALSE; if (source != 0) { - unsigned len = strlen(source); + size_t len = strlen(source); 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 = ","; - unsigned need = 1 + strlen(copied); + size_t need = 1 + strlen(copied); if (*copied == ',') comma = ""; @@ -265,11 +267,11 @@ add_to_tab_list(char **append, const char *value) if (result != 0) { *result = '\0'; if (*append != 0) { - strcpy(result, *append); + _nc_STRCPY(result, *append, need); free(*append); } - strcat(result, comma); - strcat(result, copied); + _nc_STRCAT(result, comma, need); + _nc_STRCAT(result, copied, need); } *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]); - if (!(isdigit(ch) || ch == ',')) { + if (!(isdigit(ch) || ch == ',' || 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; - const char *mar_list = 0; /* ignored */ 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': - 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: - 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;