]> git.wh0rd.org Git - nano.git/commitdiff
port over DB's number parsing code and related bits, with a few minor
authorDavid Lawrence Ramsey <pooka109@gmail.com>
Mon, 12 Jul 2004 16:07:14 +0000 (16:07 +0000)
committerDavid Lawrence Ramsey <pooka109@gmail.com>
Mon, 12 Jul 2004 16:07:14 +0000 (16:07 +0000)
changes of mine, and add a few related variable type changes

git-svn-id: svn://svn.savannah.gnu.org/nano/trunk/nano@1853 35c25a1d-7b9e-4130-9fde-d3aeb78583b8

ChangeLog
src/global.c
src/nano.c
src/proto.h
src/rcfile.c
src/search.c
src/utils.c

index 2c9f66d1870a7c867fb406b2262ec85ff86e0d5b..69d2ed6bf713f58ad2b9b9d0837584bf00381881 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -28,6 +28,16 @@ CVS code -
          with all the other lists, have the replace list accept all the
          same function keys as the search list, and clarify a few
          shortcut descriptions.
+       - Convert nano to use the new parse_num() function to read in
+         numeric values at the command line and in the rcfile, and
+         duplicate the messages used in the rcfile in the command line
+         for consistency. (David Benbennick)  DLR: Convert tabsize,
+         wrap_at, and fill to ssize_t in order to work with
+         parse_num() properly and also to increase their capacity
+         while keeping the ability to hold negative numbers in case of
+         errors.  Also exit instead of calling usage() in the event of
+         an invalid fill value, for consistency with how an invalid
+         tabsize value is handled.
 - files.c:
   close_open_file()
        - Tweak to no longer rely on the return values of
@@ -73,6 +83,12 @@ CVS code -
   nregcomp()
        - Rename the variable flags to eflags so as not to conflict with
          the global flags. (DLR)
+- utils.c:
+  parse_num()
+       - New function to parse numeric values, so that we don't have to
+         duplicate code that calls strtol() all over the place. (David
+         Benbennick)  DLR: Renamed from parse_int() to parse_num() and
+         converted to use ssize_t instead of int.
 - winio.c:
   get_control_kbinput()
        - Fix erroneous debugging statement so that nano compiles with
index 466abcef4bf44002c32775368388e82725dcac34..26a05f7b7d3dfe33ac8d8e09099595a8f4d93f28 100644 (file)
@@ -30,8 +30,9 @@
 /* Global variables */
 
 #ifndef DISABLE_WRAPJUSTIFY
-/* wrap_at might be set in rcfile.c or nano.c */
-int wrap_at = -CHARS_FROM_EOL;/* Right justified fill value, allows resize */
+/* wrap_at might be set in rcfile.c or nano.c. */
+ssize_t wrap_at = -CHARS_FROM_EOL;     /* Right justified fill value,
+                                          allows resize */
 #endif
 
 char *last_search = NULL;      /* Last string we searched for */
@@ -94,8 +95,8 @@ int placewewant = 0;          /* The column we'd like the cursor
                                   to jump to when we go to the
                                   next or previous line */
 
-int tabsize = -1;              /* Our internal tabsize variable.  The
-                                  default value is set in main(). */
+ssize_t tabsize = -1;          /* Our internal tabsize variable.  The
+                                  default value is set in main(). */
 
 char *hblank = NULL;           /* A horizontal blank line */
 #ifndef DISABLE_HELP
index b33aeaaeb47eda6fcf03523faf57bac6c0e3abb7..cada0949b751724b124680dbd8e80e07d72b3732 100644 (file)
@@ -58,7 +58,8 @@
 #endif
 
 #ifndef DISABLE_WRAPJUSTIFY
-static int fill = 0;   /* Fill - where to wrap lines, basically */
+static ssize_t fill = 0;       /* Fill - where to wrap lines,
+                                  basically */
 #endif
 #ifndef DISABLE_WRAPPING
 static int same_line_wrap = FALSE;     /* Whether wrapped text should
@@ -3173,21 +3174,10 @@ int main(int argc, char *argv[])
            break;
 #endif
        case 'T':
-           {
-               int i;
-               char *first_error;
-
-               /* Using strtol() instead of atoi() lets us accept 0
-                * while checking other errors. */
-               i = (int)strtol(optarg, &first_error, 10);
-               if (errno == ERANGE || *optarg == '\0' || *first_error != '\0')
-                   usage();
-               else
-                   tabsize = i;
-               if (tabsize <= 0) {
-                   fprintf(stderr, _("Tab size is too small for nano...\n"));
-                   exit(1);
-               }
+           if (parse_num(optarg, &tabsize) == -1 || tabsize <= 0) {
+               fprintf(stderr, _("Requested tab size %s invalid"), optarg);
+               fprintf(stderr, "\n");
+               exit(1);
            }
            break;
        case 'V':
@@ -3233,17 +3223,10 @@ int main(int argc, char *argv[])
            break;
 #ifndef DISABLE_WRAPJUSTIFY
        case 'r':
-           {
-               int i;
-               char *first_error;
-
-               /* Using strtol() instead of atoi() lets us accept 0
-                * while checking other errors. */
-               i = (int)strtol(optarg, &first_error, 10);
-               if (errno == ERANGE || *optarg == '\0' || *first_error != '\0')
-                   usage();
-               else
-                   wrap_at = i;
+           if (parse_num(optarg, &wrap_at) == -1) {
+               fprintf(stderr, _("Requested fill size %s invalid"), optarg);
+               fprintf(stderr, "\n");
+               exit(1);
            }
            fill_flag_used = TRUE;
            break;
@@ -3298,7 +3281,7 @@ int main(int argc, char *argv[])
        char *operating_dir_cpy = operating_dir;
 #endif
 #ifndef DISABLE_WRAPPING
-       int wrap_at_cpy = wrap_at;
+       ssize_t wrap_at_cpy = wrap_at;
 #endif
 #ifndef NANO_SMALL
        char *backup_dir_cpy = backup_dir;
@@ -3309,7 +3292,7 @@ int main(int argc, char *argv[])
 #ifndef DISABLE_SPELLER
        char *alt_speller_cpy = alt_speller;
 #endif
-       int tabsize_cpy = tabsize;
+       ssize_t tabsize_cpy = tabsize;
        long flags_cpy = flags;
 
 #ifndef DISABLE_OPERATINGDIR
@@ -3528,7 +3511,7 @@ int main(int argc, char *argv[])
     titlebar(NULL);
 
     if (startline > 0)
-       do_gotoline(startline, 0);
+       do_gotoline(startline, FALSE);
 
 #ifndef NANO_SMALL
     /* Return here after a SIGWINCH. */
index 2a428df0013de5ecfbaa0fccf6841781c9b8ebc0..810cc43c4c4080806d6c3e05426d32f5b84f5c97 100644 (file)
 /* Externs. */
 
 #include <sys/stat.h>
-
 #ifdef HAVE_REGEX_H
 #include <regex.h>
 #endif
-
 #include "nano.h"
 
 #ifndef DISABLE_WRAPJUSTIFY
-extern int wrap_at;
+extern ssize_t wrap_at;
 #endif
 extern int editwinrows;
 extern int current_x, current_y, totlines;
@@ -40,7 +38,7 @@ extern int mark_beginx;
 #endif
 extern long totsize;
 extern long flags;
-extern int tabsize;
+extern ssize_t tabsize;
 extern int search_last_line;
 extern int currslen;
 
@@ -403,7 +401,7 @@ char *replace_line(const char *needle);
 int do_replace_loop(const char *needle, const filestruct *real_current,
        size_t *real_current_x, int wholewords);
 void do_replace(void);
-void do_gotoline(int line, int save_pos);
+void do_gotoline(ssize_t line, int save_pos);
 void do_gotoline_void(void);
 #if defined (ENABLE_MULTIBUFFER) || !defined (DISABLE_SPELLER)
 void do_gotopos(int line, int pos_x, int pos_y, int pos_placewewant);
@@ -438,6 +436,7 @@ int is_blank_char(int c);
 #endif
 int is_cntrl_char(int c);
 int num_of_digits(int n);
+int parse_num(const char *str, ssize_t *val);
 void align(char **strp);
 void null_at(char **data, size_t index);
 void unsunder(char *str, size_t true_len);
index 09c96cf82f4e105dc14ff733ce8995033c6ad71e..242d500710b6701131fc41a19e893f8c3867493b 100644 (file)
@@ -476,7 +476,7 @@ void parse_colors(char *ptr)
 void parse_rcfile(FILE *rcstream)
 {
     char *buf, *ptr, *keyword, *option;
-    int set = 0, i, j;
+    int set = 0, i;
 
     buf = charalloc(1024);
     while (fgets(buf, 1023, rcstream) != 0) {
@@ -571,18 +571,10 @@ void parse_rcfile(FILE *rcstream)
 #endif
 #ifndef DISABLE_WRAPJUSTIFY
                            if (!strcasecmp(rcopts[i].name, "fill")) {
-                               char *first_error;
-
-                               /* Using strtol() instead of atoi() lets
-                                * us accept 0 while checking other
-                                * errors. */
-                               j = (int)strtol(option, &first_error, 10);
-                               if (errno == ERANGE || *option == '\0' || *first_error != '\0')
+                               if (parse_num(option, &wrap_at) == -1)
                                    rcfile_error(
-                                       N_("Requested fill size %d invalid"),
-                                       j);
-                               else
-                                   wrap_at = j;
+                                       N_("Requested fill size %s invalid"),
+                                       option);
                            } else
 #endif
 #ifndef NANO_SMALL
@@ -630,17 +622,10 @@ void parse_rcfile(FILE *rcstream)
                            else
 #endif
                            if (!strcasecmp(rcopts[i].name, "tabsize")) {
-                               char *first_error;
-
-                               /* Using strtol instead of atoi lets us
-                                * accept 0 while checking other
-                                * errors. */
-                               j = (int)strtol(option, &first_error, 10);
-                               if (errno == ERANGE || *option == '\0' || *first_error != '\0')
-                                   rcfile_error(N_("Requested tab size %d invalid"),
-                                       j);
-                               else
-                                   tabsize = j;
+                               if (parse_num(option, &tabsize) == -1)
+                                   rcfile_error(
+                                       N_("Requested tab size %s invalid"),
+                                       option);
                            }
                        } else
                            SET(rcopts[i].flag);
index 590b677fdf63bc41eec1faaf24f7a4740da771a9..1e24d814b952260636bcd363de51309d5312abaf 100644 (file)
@@ -238,11 +238,9 @@ int search_init(int replacing)
 #ifndef NANO_SMALL
            search_history.current = search_history.next;
 #endif
-           i = (int)strtol(answer, &buf, 10);  /* Just testing answer here. */
-           if (!(errno == ERANGE || *answer == '\0' || *buf != '\0'))
-               do_gotoline(-1, FALSE);
-           else
-               do_gotoline_void();
+          /* If answer parses as an integer, put it up on the
+           * statusbar. */
+           do_gotoline(parse_num(answer, NULL), FALSE);
            /* Fall through. */
        default:
            return -1;
@@ -828,7 +826,7 @@ void do_replace(void)
     replace_abort();
 }
 
-void do_gotoline(int line, int save_pos)
+void do_gotoline(ssize_t line, int save_pos)
 {
     if (line <= 0) {           /* Ask for it */
        char *ans = mallocstrcpy(NULL, answer);
index 65cd6819aad8d69a5e8a1e711ae1a3a093a563fa..3cb91748a69d19aa6f94132a700dbe265537ede9 100644 (file)
 
 #include "config.h"
 
-#include <stdio.h>
-#include <unistd.h>
 #include <stdlib.h>
 #include <string.h>
+#include <stdio.h>
+#include <unistd.h>
 #include <ctype.h>
+#include <errno.h>
 #include <assert.h>
 #include "proto.h"
 #include "nano.h"
@@ -83,6 +84,22 @@ int num_of_digits(int n)
     return i;
 }
 
+/* Read an int from str, and store it in *val (if val is not NULL).  On
+ * error, we return -1 and don't change *val. */
+int parse_num(const char *str, ssize_t *val)
+{
+    char *first_error;
+    ssize_t j;
+
+    assert(str != NULL);
+    j = (ssize_t)strtol(str, &first_error, 10);
+    if (errno == ERANGE || *str == '\0' || *first_error != '\0')
+       return -1;
+    if (val != NULL)
+       *val = j;
+    return 0;
+}
+
 /* Fix the memory allocation for a string. */
 void align(char **strp)
 {