if (update)
{
char cmd[BUFSIZ];
+ int len;
+
for (i = 0; i < current_arg; ++i)
{
switch (argbuffer[i].arg_type)
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);
}
/* 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;
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++)
{
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;
}
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;
}
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;
}
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;
}
return FALSE;
/* all the rest */
+ case otagseen:
+ case ocatseen:
+ case omethodtag:
default:
break;
}
case fignore:
case vignore:
break;
+ case fvnone:
+ case fdefunkey:
+ case fdefunname:
+ case foperator:
+ case fvnameseen:
+ case fstartlist:
default:
fvdef = fvnone;
}
break;
/* all the rest */
+ case tkeyseen:
+ case tinbody:
+ case tend:
+ case tignore:
default:
break;
}
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;
}
case fignore:
case vignore:
break;
+ case fvnone:
+ case fdefunname:
+ case foperator:
+ case fvnameseen:
+ case flistseen:
default:
fvextern = FALSE;
fvdef = fvnone;
break;
/* all the rest */
+ case fvnone:
+ case fdefunkey:
+ case fdefunname:
+ case foperator:
+ case fvnameseen:
+ case finlist:
+ case fignore:
+ case vignore:
default:
break;
}
break;
/* all the rest */
+ case ddefineseen:
+ case dignorerest:
default:
break;
}
break;
/* all the rest */
+ case onone:
+ case oprotocol:
+ case oimplementation:
+ case oparenseen:
+ case ocatseen:
+ case oinbody:
+ case omethodsign:
+ case omethodcolon:
+ case oignore:
default:
break;
}
&& 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;
token.valid = FALSE;
} /* switch (fvdef) */
/* FALLTHRU */
+ case tkeyseen:
default:
if (!instruct)
typdef = tnone;
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;
}
fvdef = fvnone;
token.valid = FALSE;
break;
+ case fvnone:
default:
fvdef = fvnone;
}
&& (!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;
}
break;
/* all the rest */
+ case fvnone:
+ case fdefunkey:
+ case fdefunname:
+ case fstartlist:
+ case finlist:
+ case fignore:
+ case vignore:
default:
break;
}
break;
/* all the rest */
+ case fvnone:
+ case fdefunkey:
+ case fdefunname:
+ case foperator:
+ case fvnameseen:
+ case flistseen:
+ case fignore:
+ case vignore:
default:
break;
}
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
break;
/* all the rest */
+ case fdefunkey:
+ case fdefunname:
+ case foperator:
+ case fvnameseen:
+ case fstartlist:
+ case finlist:
+ case vignore:
default:
break;
}
break;
/* all the rest */
+ case snone:
default:
break;
}
|| (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;
}
case fignore:
case vignore:
break;
+ case fvnone:
+ case fdefunkey:
+ case fdefunname:
+ case fvnameseen:
+ case fstartlist:
+ case flistseen:
default:
fvdef = fvnone;
}
/* 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);
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;
{
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);
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;
}