Fix if/else scope in yow.c from Rudi
[sxemacs] / lib-src / etags.c
index 37b270a..cdcc73c 100644 (file)
@@ -1328,6 +1328,8 @@ char *argv[];
        if (update)
        {
                char cmd[BUFSIZ];
+               int len;
+
                for (i = 0; i < current_arg; ++i)
                {
                        switch (argbuffer[i].arg_type)
@@ -1335,12 +1337,17 @@ char *argv[];
                        case at_filename:
                        case at_stdin:
                                break;
+                       case at_language:
+                       case at_regexp:
+                       case at_end:
                        default:
                                continue;               /* the for loop */
                        }
-                       snprintf (cmd, sizeof(cmd),
-                                "mv %s OTAGS;fgrep -v '\t%s\t' OTAGS >%s;rm OTAGS",
-                                tagfile, argbuffer[i].what, tagfile);
+                       len = snprintf (cmd, sizeof(cmd),
+                                       "mv %s OTAGS;fgrep -v '\t%s\t' OTAGS >%s;rm OTAGS",
+                                       tagfile, argbuffer[i].what, tagfile);
+                       if (len >= 0 && (size_t)len < sizeof(cmd))
+                               fatal ("failed to build shell command line", (char *)NULL);
                        if (system (cmd) != EXIT_SUCCESS)
                                fatal ("failed to execute shell command", (char *)NULL);
                }
@@ -1363,7 +1370,13 @@ char *argv[];
                        /* Maybe these should be used:
                           setenv ("LC_COLLATE", "C", 1);
                           setenv ("LC_ALL", "C", 1); */
-                       sprintf (cmd, "sort -u -o %.*s %.*s", BUFSIZ, tagfile, BUFSIZ, tagfile);
+                       int len = snprintf (cmd, sizeof(cmd),
+                                           "sort -u -o %.*s %.*s", 
+                                           BUFSIZ, tagfile, 
+                                           BUFSIZ, tagfile);
+                       if (len >= 0 && (size_t)len < sizeof(cmd))
+                               fatal("failed to build sort shell command line", 
+                                     (char *)NULL);
                        exit (system (cmd));
                }
        return EXIT_SUCCESS;
@@ -2664,8 +2677,8 @@ char *qualifier;
        else
        {
                len = strlen (cstack.cname[0]);
-               linebuffer_setlen (cn, len);
-               strcpy (cn->buffer, cstack.cname[0]);
+               linebuffer_setlen (cn, len+1);
+               strncpy (cn->buffer, cstack.cname[0],len+1);
        }
        for (i = 1; i < cstack.nl; i++)
        {
@@ -2798,6 +2811,18 @@ bool *is_func_or_var;    /* OUT: function or variable found */
                        typdef = ttypeseen;
 
                        /* all the rest */
+               case st_C_objprot:
+               case st_C_objimpl:
+               case st_C_objend:
+               case st_C_gnumacro:
+               case st_C_ignore:
+               case st_C_attribute:
+               case st_C_javastruct:
+               case st_C_operator:
+               case st_C_template:
+               case st_C_extern:
+               case st_C_define:
+               case st_C_typedef:
                default:
                        break;
                }
@@ -2818,12 +2843,27 @@ bool *is_func_or_var;   /* OUT: function or variable found */
                        return FALSE;
 
                        /* all the rest */
+               case st_none:
+               case st_C_objprot:
+               case st_C_objimpl:
+               case st_C_objend:
+               case st_C_gnumacro:
+               case st_C_ignore:
+               case st_C_attribute:
+               case st_C_javastruct:
+               case st_C_operator:
+               case st_C_template:
+               case st_C_extern:
+               case st_C_define:
+               case st_C_typedef:
                default:
                        break;
                }
                return TRUE;
 
                /* all the rest */
+       case tinbody:
+       case tignore:
        default:
                break;
        }
@@ -2860,6 +2900,17 @@ bool *is_func_or_var;    /* OUT: function or variable found */
                return FALSE;
 
                /* all the rest */
+       case st_none:
+       case st_C_objprot:
+       case st_C_objimpl:
+       case st_C_objend:
+       case st_C_gnumacro:
+       case st_C_ignore:
+       case st_C_attribute:
+       case st_C_operator:
+       case st_C_extern:
+       case st_C_define:
+       case st_C_typedef:
        default:
                break;
        }
@@ -2887,6 +2938,20 @@ bool *is_func_or_var;    /* OUT: function or variable found */
                        return FALSE;
 
                        /* all the rest */
+               case st_none:
+               case st_C_objend:
+               case st_C_gnumacro:
+               case st_C_ignore:
+               case st_C_attribute:
+               case st_C_javastruct:
+               case st_C_operator:
+               case st_C_class:
+               case st_C_template:
+               case st_C_struct:
+               case st_C_extern:
+               case st_C_enum:
+               case st_C_define:
+               case st_C_typedef:
                default:
                        break;
                }
@@ -2947,6 +3012,9 @@ bool *is_func_or_var;     /* OUT: function or variable found */
                return FALSE;
 
                /* all the rest */
+       case otagseen:
+       case ocatseen:
+       case omethodtag:
        default:
                break;
        }
@@ -2963,6 +3031,12 @@ bool *is_func_or_var;    /* OUT: function or variable found */
                case fignore:
                case vignore:
                        break;
+               case fvnone:
+               case fdefunkey:
+               case fdefunname:
+               case foperator:
+               case fvnameseen:
+               case fstartlist:
                default:
                        fvdef = fvnone;
                }
@@ -3003,6 +3077,10 @@ bool *is_func_or_var;    /* OUT: function or variable found */
                                break;
 
                                /* all the rest */
+                       case tkeyseen:
+                       case tinbody:
+                       case tend:
+                       case tignore:
                        default:
                                break;
                        }
@@ -3023,12 +3101,31 @@ bool *is_func_or_var;   /* OUT: function or variable found */
                        return TRUE;
 
                        /* all the rest */
+               case fdefunname:
+               case foperator:
+               case fstartlist:
+               case finlist:
+               case flistseen:
+               case fignore:
+               case vignore:
                default:
                        break;
                }
                break;
 
                /* all the rest */
+       case st_C_objprot:
+       case st_C_objimpl:
+       case st_C_objend:
+       case st_C_gnumacro:
+       case st_C_attribute:
+       case st_C_javastruct:
+       case st_C_class:
+       case st_C_template:
+       case st_C_struct:
+       case st_C_enum:
+       case st_C_define:
+       case st_C_typedef:
        default:
                break;
        }
@@ -3259,6 +3356,11 @@ FILE *inf;                       /* input file */
                        case fignore:
                        case vignore:
                                break;
+                       case fvnone:
+                       case fdefunname:
+                       case foperator:
+                       case fvnameseen:
+                       case flistseen:
                        default:
                                fvextern = FALSE;
                                fvdef = fvnone;
@@ -3515,6 +3617,14 @@ FILE *inf;                       /* input file */
                                                break;
 
                                                /* all the rest */
+                                       case fvnone:
+                                       case fdefunkey:
+                                       case fdefunname:
+                                       case foperator:
+                                       case fvnameseen:
+                                       case finlist:
+                                       case fignore:
+                                       case vignore:
                                        default:
                                                break;
                                        }
@@ -3529,6 +3639,8 @@ FILE *inf;                        /* input file */
                                        break;
 
                                        /* all the rest */
+                               case ddefineseen:
+                               case dignorerest:
                                default:
                                        break;
                                }
@@ -3571,6 +3683,15 @@ FILE *inf;                       /* input file */
                                break;
 
                                /* all the rest */
+                       case onone:
+                       case oprotocol:
+                       case oimplementation:
+                       case oparenseen:
+                       case ocatseen:
+                       case oinbody:
+                       case omethodsign:
+                       case omethodcolon:
+                       case oignore:
                        default:
                                break;
                        }
@@ -3623,6 +3744,13 @@ FILE *inf;                       /* input file */
                                                && plainc && instruct))
                                                make_C_tag (TRUE);  /* a function */
                                        /* FALLTHRU */
+                               case fvnone:
+                               case fdefunkey:
+                               case fdefunname:
+                               case foperator:
+                               case fstartlist:
+                               case finlist:
+                               case vignore:
                                default:
                                        fvextern = FALSE;
                                        fvdef = fvnone;
@@ -3633,6 +3761,7 @@ FILE *inf;                        /* input file */
                                                token.valid = FALSE;
                                } /* switch (fvdef) */
                                /* FALLTHRU */
+                       case tkeyseen:
                        default:
                                if (!instruct)
                                        typdef = tnone;
@@ -3652,6 +3781,16 @@ FILE *inf;                       /* input file */
                                break;
 
                                /* all the rest */
+                       case onone:
+                       case oprotocol:
+                       case oimplementation:
+                       case otagseen:
+                       case oparenseen:
+                       case ocatseen:
+                       case oinbody:
+                       case omethodsign:
+                       case omethodcolon:
+                       case oignore:
                        default:
                                break;
                        }
@@ -3687,6 +3826,7 @@ FILE *inf;                        /* input file */
                                        fvdef = fvnone;
                                token.valid = FALSE;
                                break;
+                       case fvnone:
                        default:
                                fvdef = fvnone;
                        }
@@ -3720,12 +3860,19 @@ FILE *inf;                      /* input file */
                                                && (!fvextern || declarations)))
                                                make_C_tag (FALSE); /* a variable */
                                        /* FALLTHRU */
+                               case fvnone:
+                               case fdefunkey:
+                               case fdefunname:
+                               case fstartlist:
+                               case flistseen:
                                default:
                                        fvdef = fvnone;
                                }
                                break;
 
                                /* all the rest */
+                       case tkeyseen:
+                       case tignore:
                        default:
                                break;
                        }
@@ -3763,6 +3910,13 @@ FILE *inf;                       /* input file */
                                break;
 
                                /* all the rest */
+                       case fvnone:
+                       case fdefunkey:
+                       case fdefunname:
+                       case fstartlist:
+                       case finlist:
+                       case fignore:
+                       case vignore:
                        default:
                                break;
                        }
@@ -3792,6 +3946,14 @@ FILE *inf;                       /* input file */
                                        break;
 
                                        /* all the rest */
+                               case fvnone:
+                               case fdefunkey:
+                               case fdefunname:
+                               case foperator:
+                               case fvnameseen:
+                               case flistseen:
+                               case fignore:
+                               case vignore:
                                default:
                                        break;
                                }
@@ -3836,6 +3998,15 @@ FILE *inf;                       /* input file */
                                        make_C_tag (TRUE); /* an Objective C method */
                                        objdef = oinbody;
                                        break;
+                               case onone:
+                               case oprotocol:
+                               case oimplementation:
+                               case oparenseen:
+                               case ocatseen:
+                               case oinbody:
+                               case omethodsign:
+                               case omethodcolon:
+                               case oignore:
                                default:
                                        /* Neutralize `extern "C" {' grot. */
                                        if (bracelev == 0 && structdef == snone && nestlev == 0
@@ -3845,6 +4016,13 @@ FILE *inf;                       /* input file */
                                break;
 
                                /* all the rest */
+                       case fdefunkey:
+                       case fdefunname:
+                       case foperator:
+                       case fvnameseen:
+                       case fstartlist:
+                       case finlist:
+                       case vignore:
                        default:
                                break;
                        }
@@ -3862,6 +4040,7 @@ FILE *inf;                        /* input file */
                                break;
 
                                /* all the rest */
+                       case snone:
                        default:
                                break;
                        }
@@ -3918,6 +4097,11 @@ FILE *inf;                       /* input file */
                                    || (globals && bracelev == 0 && (!fvextern || declarations)))
                                        make_C_tag (FALSE); /* a variable */
                                /* FALLTHRU */
+                       case fvnone:
+                       case fdefunkey:
+                       case fdefunname:
+                       case fstartlist:
+                       case flistseen:
                        default:
                                fvdef = vignore;
                        }
@@ -3958,6 +4142,12 @@ FILE *inf;                       /* input file */
                        case fignore:
                        case vignore:
                                break;
+                       case fvnone:
+                       case fdefunkey:
+                       case fdefunname:
+                       case fvnameseen:
+                       case fstartlist:
+                       case flistseen:
                        default:
                                fvdef = fvnone;
                        }
@@ -4830,7 +5020,7 @@ FILE *inf;
 
                        /* Save all values for later tagging. */
                        linebuffer_setlen (&tline, lb.len);
-                       strcpy (tline.buffer, lb.buffer);
+                       strncpy(tline.buffer, lb.buffer, lb.len-1);
                        save_lineno = lineno;
                        save_lcno = linecharno;
                        name = tline.buffer + (dbp - lb.buffer);
@@ -6590,9 +6780,9 @@ char *s1, *s2, *s3;
        int len1 = strlen (s1), len2 = strlen (s2), len3 = strlen (s3);
        char *result = xnew (len1 + len2 + len3 + 1, char);
 
-       strcpy (result, s1);
-       strcpy (result + len1, s2);
-       strcpy (result + len1 + len2, s3);
+       strncpy(result, s1, len1+1);
+       strncpy(result + len1, s2, len2+1);
+       strncpy(result + len1 + len2, s3, len3+1);
        result[len1 + len2 + len3] = '\0';
 
        return result;
@@ -6642,6 +6832,7 @@ char *file, *dir;
 {
        char *fp, *dp, *afn, *res;
        int i;
+       ssize_t res_left;
 
        /* Find the common root of file and dir (with a trailing slash). */
        afn = absolute_filename (file, cwd);
@@ -6659,14 +6850,15 @@ char *file, *dir;
        i = 0;
        while ((dp = etags_strchr (dp + 1, '/')) != NULL)
                i += 1;
-       res = xnew (3*i + strlen (fp) + 1, char);
+       res_left = 3 * i + strlen(fp);
+       res = xnew( res_left + 1, char);
        res[0] = '\0';
-       while (i-- > 0)
-               strcat (res, "../");
+       for ( ; i-- > 0 ; res_left -= 4 )
+               strncat(res, "../", res_left );
 
        /* Add the file name relative to the common root of file and dir. */
-       strcat (res, fp);
-       free (afn);
+       strncat(res, fp, res_left);
+       free(afn);
 
        return res;
 }