diff -u -r old_6.3.4/libutil/args.c new_7.7.7/libutil/args.c
--- old_6.3.4/libutil/args.c 2015-02-02 09:32:23 +0000
+++ new_7.7.7/libutil/args.c 2015-03-08 07:47:36 +0000
@@ -93,7 +93,7 @@
/**
* args_open_gfind: #args_open like interface for handling output of @NAME{gfind}.
*
- * @param[in] agp GFIND descriptor
+ * @param[in] agp #GFIND descriptor
*/
void
args_open_gfind(GFIND *agp)
@@ -170,11 +170,11 @@
/**
* preparse_options
*
- * @param[in] argc
- * @param[in] argv
+ * @param[in] argc main()'s argc integer
+ * @param[in] argv main()'s argv string array
*
- * Setup the GTAGSCONF and the GTAGSLABEL environment variable
- * according to the --gtagsconf and --gtagslabel option.
+ * Setup the @FILE{GTAGSCONF} and the @FILE{GTAGSLABEL} environment variables
+ * according to the @OPTION{--gtagsconf} and @OPTION{--gtagslabel} options.
*/
void
preparse_options(int argc, char *const *argv)
@@ -183,11 +183,11 @@
char *p;
char *confpath = NULL;
char *label = NULL;
- char *opt_gtagsconf = "--gtagsconf";
- char *opt_gtagslabel = "--gtagslabel";
+ const char *opt_gtagsconf = "--gtagsconf";
+ const char *opt_gtagslabel = "--gtagslabel";
for (i = 1; i < argc; i++) {
- p = argv[i];
+ /* p = argv[i]; */
if ((p = locatestring(argv[i], opt_gtagsconf, MATCH_AT_FIRST))) {
if (*p == '\0') {
@@ -222,11 +222,15 @@
set_env("GTAGSLABEL", label);
}
/**
- * prepend_options:
+ * prepend_options: creates a new argv main() array, by prepending (space separated)
+ * options and arguments from the string argument @a options.
*
- * @param[in/out] argc
- * @param[in] argv
- * @param[in] options
+ * @param[in,out] argc pointer to main()'s argc integer
+ * @param[in] argv main()'s argv string array
+ * @param[in] options string
+ * @return The new argv array.
+ *
+ * @remark The program's name is copied back into: returned[0] (argv[0]).
*/
char **
prepend_options(int *argc, char *const *argv, const char *options)
diff -u -r old_6.3.4/libutil/assoc.c new_7.7.7/libutil/assoc.c
--- old_6.3.4/libutil/assoc.c 2015-02-02 09:32:23 +0000
+++ new_7.7.7/libutil/assoc.c 2015-03-13 02:23:38 +0000
@@ -86,13 +86,14 @@
DB *db = assoc->db;
DBT key, dat;
int status;
+ int length;
if (db == NULL)
die("associate array is not prepared.");
- if (strlen(name) == 0)
+ if ((length = strlen(name)) == 0)
die("primary key size == 0.");
key.data = (char *)name;
- key.size = strlen(name)+1;
+ key.size = length+1;
dat.data = (char *)value;
dat.size = strlen(value)+1;
@@ -119,13 +120,14 @@
DB *db = assoc->db;
DBT key, dat;
int status;
+ int size;
if (db == NULL)
die("associate array is not prepared.");
- if (strlen(name) == 0)
+ if ((size = strlen(name)) == 0)
die("primary key size == 0.");
key.data = (char *)name;
- key.size = strlen(name)+1;
+ key.size = size+1;
dat.data = (char *)value;
dat.size = length;
diff -u -r old_6.3.4/libutil/conf.c new_7.7.7/libutil/conf.c
--- old_6.3.4/libutil/conf.c 2015-02-02 09:32:23 +0000
+++ new_7.7.7/libutil/conf.c 2015-03-13 02:23:36 +0000
@@ -113,7 +113,7 @@
* readrecord: read recoed indexed by label.
*
* @param[in] label label in config file
- * @return record
+ * @return record or @VAR{NULL}
*
* @par Jobs:
* - skip comment.
@@ -176,6 +176,8 @@
* @param[out] sb string buffer
* @param[in] label record label
* @param[in] level nest level for check
+ *
+ * @remark This function may call itself (recursive)
*/
static void
includelabel(STRBUF *sb, const char *label, int level)
@@ -204,7 +206,7 @@
* configpath: get path of configuration file.
*
* @param[in] rootdir Project root directory
- * @return path name of the configuration file
+ * @return path name of the configuration file or @VAR{NULL}
*/
static char *
configpath(const char *rootdir)
@@ -357,9 +359,13 @@
char buf[MAXPROPLEN];
int all = 0;
int exist = 0;
+ int bufsize;
if (!opened)
die("configuration file not opened.");
+ if (sb == NULL) {
+ return 0;
+ }
/* 'path' is reserved name for the current path of configuration file */
if (!strcmp(name, "path")) {
if (config_path)
@@ -369,17 +375,18 @@
if (!strcmp(name, "skip") || !strcmp(name, "gtags_parser") || !strcmp(name, "langmap"))
all = 1;
snprintf(buf, sizeof(buf), ":%s=", name);
+ bufsize = strlen(buf);
p = confline;
while ((p = locatestring(p, buf, MATCH_FIRST)) != NULL) {
- if (exist && sb)
+ if (exist /* && sb */ )
strbuf_putc(sb, ',');
exist = 1;
- for (p += strlen(buf); *p; p++) {
+ for (p += bufsize; *p; p++) {
if (*p == ':')
break;
if (*p == '\\' && *(p + 1) == ':') /* quoted character */
p++;
- if (sb)
+ /* if (sb) */
strbuf_putc(sb, *p);
}
if (!all)
diff -u -r old_6.3.4/libutil/dbop.c new_7.7.7/libutil/dbop.c
--- old_6.3.4/libutil/dbop.c 2015-02-02 09:32:23 +0000
+++ new_7.7.7/libutil/dbop.c 2015-03-14 06:08:44 +0000
@@ -215,7 +215,7 @@
* @param[in] flags
* #DBOP_DUP: allow duplicate records.
* #DBOP_SORTED_WRITE: use sorted writing. This requires @NAME{POSIX} sort.
- * @return descripter for @NAME{dbop_xxx()}
+ * @return descripter for @NAME{dbop_xxx()} or @VAR{NULL}
*
* Sorted wirting is fast because all writing is done by not insertion but addition.
*/
@@ -299,7 +299,7 @@
*
* @param[in] dbop descripter
* @param[in] name name
- * @return pointer to data
+ * @return pointer to data or @VAR{NULL}
*/
const char *
dbop_get(DBOP *dbop, const char *name)
@@ -362,7 +362,7 @@
return;
}
key.data = (char *)name;
- key.size = strlen(name)+1;
+ key.size = len+1;
dat.data = (char *)data;
dat.size = strlen(data)+1;
@@ -449,7 +449,7 @@
if (flag)
strbuf_puts0(sb, flag);
key.data = (char *)name;
- key.size = strlen(name)+1;
+ key.size = len+1;
dat.data = strbuf_value(sb);
dat.size = strbuf_getlen(sb);
@@ -516,8 +516,8 @@
* @param[in] preg compiled regular expression if any.
* @param[in] flags following dbop_next call take over this.
* #DBOP_KEY: read key part
- * #DBOP_PREFIX: prefix read; only valied when sequential read
- * @return data
+ * #DBOP_PREFIX: prefix read; only valid when sequential read
+ * @return data or @VAR{NULL}
*/
const char *
dbop_first(DBOP *dbop, const char *name, regex_t *preg, int flags)
@@ -525,6 +525,7 @@
DB *db = dbop->db;
DBT key, dat;
int status;
+ int len;
dbop->preg = preg;
dbop->ioflags = flags;
@@ -535,11 +536,11 @@
return dbop3_first(dbop, name, preg, flags);
#endif
if (name) {
- if (strlen(name) > MAXKEYLEN)
+ if ((len = strlen(name)) > MAXKEYLEN)
die("primary key too long.");
strlimcpy(dbop->key, name, sizeof(dbop->key));
key.data = (char *)name;
- key.size = strlen(name);
+ key.size = len;
/*
* includes NULL character unless prefix read.
*/
@@ -597,7 +598,7 @@
* dbop_next: get next record.
*
* @param[in] dbop dbop descripter
- * @return data
+ * @return data or @VAR{NULL}
*
* @note dbop_next() always skip meta records.
*/
@@ -681,6 +682,8 @@
}
/**
* get_flag: get flag value
+ *
+ * @note Will return an empty string (not @VAR{NULL}), if not found/can't get.
*/
const char *
dbop_getflag(DBOP *dbop)
@@ -707,18 +710,22 @@
}
/**
* dbop_getoption: get option
+ *
+ * @return the option's value or @VAR{NULL}
*/
const char *
dbop_getoption(DBOP *dbop, const char *key)
{
static char buf[1024];
const char *p;
+ int keysize;
if ((p = dbop_get(dbop, key)) == NULL)
return NULL;
- if (dbop->lastsize < strlen(key))
+ keysize = strlen(key);
+ if (dbop->lastsize < keysize)
die("invalid format (dbop_getoption).");
- for (p += strlen(key); *p && isspace((unsigned char)*p); p++)
+ for (p += keysize; *p && isspace((unsigned char)*p); p++)
;
strlimcpy(buf, p, sizeof(buf));
return buf;
diff -u -r old_6.3.4/libutil/getdbpath.c new_7.7.7/libutil/getdbpath.c
--- old_6.3.4/libutil/getdbpath.c 2015-02-02 09:32:23 +0000
+++ new_7.7.7/libutil/getdbpath.c 2015-03-13 02:23:38 +0000
@@ -304,7 +304,13 @@
}
sb = strbuf_open(0);
s = strbuf_fgets(sb, fp, STRBUF_NOCRLF);
- if (!test("d", s)) {
+ if(s == NULL) {
+ /* Empty file? */
+ if(verbose)
+ fprintf(stderr, "'%s' ignored; strbuf_fgets() returned NULL.\n", path);
+ goto ignore_lab;
+ }
+ if (!test("d", s)) { /* XXX: if s == NULL, test() will use previous path used. */
if (verbose)
fprintf(stderr, "'%s' ignored because it doesn't include existent directory name.\n", path);
} else {
@@ -316,6 +322,7 @@
s = realpath(makepath(root, s, NULL), buf);
strlimcpy(root, s, MAXPATHLEN);
}
+ignore_lab:;
fclose(fp);
strbuf_close(sb);
break;
@@ -328,12 +335,13 @@
return 0;
}
/**
- * in_the_project: test whether path is in the project.
+ * in_the_project: test whether @a path is in the project.
*
- * @param[in] target file or directory
+ * @param[in] path target file or directory
* @return 0: out of the project, 1: in the project
*
- * Please pass an absolute path name which does not include '.' or '..'.
+ * @note Please pass an absolute path name which does not include @FILE{.} (current directory) or
+ * @FILE{..} (parent directory).
*/
int
in_the_project(const char *path)
diff -u -r old_6.3.4/libutil/makepath.c new_7.7.7/libutil/makepath.c
--- old_6.3.4/libutil/makepath.c 2015-02-02 09:32:23 +0000
+++ new_7.7.7/libutil/makepath.c 2015-03-13 02:23:38 +0000
@@ -70,12 +70,11 @@
makepath(const char *dir, const char *file, const char *suffix)
{
STATIC_STRBUF(sb);
- int length;
char sep = '/';
strbuf_clear(sb);
if (dir != NULL) {
- if ((length = strlen(dir)) > MAXPATHLEN)
+ if ( strlen(dir) > MAXPATHLEN)
die("path name too long. '%s'\n", dir);
#if defined(_WIN32) || defined(__DJGPP__)
@@ -93,7 +92,7 @@
strbuf_putc(sb, '.');
strbuf_puts(sb, suffix);
}
- if ((length = strlen(strbuf_value(sb))) > MAXPATHLEN)
+ if ( strbuf_getlen(sb) > MAXPATHLEN)
die("path name too long. '%s'\n", strbuf_value(sb));
return strbuf_value(sb);
}
diff -u -r old_6.3.4/libutil/path.c new_7.7.7/libutil/path.c
--- old_6.3.4/libutil/path.c 2015-02-02 09:32:23 +0000
+++ new_7.7.7/libutil/path.c 2015-03-06 05:00:56 +0000
@@ -165,6 +165,10 @@
#if (defined(_WIN32) && !defined(__CYGWIN__)) || defined(__DJGPP__)
/**
* realpath: get the complete path
+ *
+ * @param[in] in_path
+ * @param[out] out_path result string
+ * @return @a out_path
*/
char *
realpath(const char *in_path, char *out_path)
@@ -200,6 +204,8 @@
* -1: base directory not found
* -2: permission error
* -3: cannot make directory
+ *
+ * @remark Directories are created in mode 0775.
*/
int
makedirectories(const char *base, const char *rest, int verbose)
@@ -238,6 +244,8 @@
}
/**
* trimpath: trim path name
+ *
+ * @remark Just skips over @CODE{"./"} at the beginning of @a path, if present.
*/
const char *
trimpath(const char *path)
@@ -248,6 +256,10 @@
}
/**
* get the current directory
+ *
+ * @param[out] buf result string
+ * @param[in] size size of @a buf
+ * @return @a buf or NULL
*/
char *
vgetcwd(char *buf, size_t size) {