Module Name: othersrc Committed By: dholland Date: Sat Mar 23 22:00:51 UTC 2013
Modified Files: othersrc/usr.bin/dholland-make2: meta.c Log Message: Rip the linked lists out of here and make it build again. To generate a diff of this commit: cvs rdiff -u -r1.2 -r1.3 othersrc/usr.bin/dholland-make2/meta.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: othersrc/usr.bin/dholland-make2/meta.c diff -u othersrc/usr.bin/dholland-make2/meta.c:1.2 othersrc/usr.bin/dholland-make2/meta.c:1.3 --- othersrc/usr.bin/dholland-make2/meta.c:1.2 Mon Feb 25 03:39:28 2013 +++ othersrc/usr.bin/dholland-make2/meta.c Sat Mar 23 22:00:51 2013 @@ -1,4 +1,4 @@ -/* $NetBSD: meta.c,v 1.2 2013/02/25 03:39:28 dholland Exp $ */ +/* $NetBSD: meta.c,v 1.3 2013/03/23 22:00:51 dholland Exp $ */ /* * Implement 'meta' mode. @@ -54,10 +54,10 @@ # define USE_FILEMON #endif -MAKE_RCSID("$NetBSD: meta.c,v 1.2 2013/02/25 03:39:28 dholland Exp $"); +MAKE_RCSID("$NetBSD: meta.c,v 1.3 2013/03/23 22:00:51 dholland Exp $"); static BuildMon Mybm; /* for compat */ -static Lst metaBailiwick; /* our scope of control */ +static struct stringarray metaBailiwick; /* our scope of control */ Boolean useMeta = FALSE; static Boolean useFilemon = FALSE; @@ -307,12 +307,10 @@ meta_name(struct GNode *gn, char *mname, * Bypassed if target is flagged .MAKE */ static int -is_submake(void *cmdp, void *gnp) +is_submake(const char *cmd, GNode *gn) { static char *p_make = NULL; static int p_len; - char *cmd = cmdp; - GNode *gn = gnp; char *mp = NULL; char *cp; char *cp2; @@ -360,10 +358,8 @@ typedef struct meta_file_s { } meta_file_t; static int -printCMD(void *cmdp, void *mfpp) +printCMD(const char *cmd, meta_file_t *mfp) { - meta_file_t *mfp = mfpp; - char *cmd = cmdp; char *cp = NULL; if (strchr(cmd, '$')) { @@ -400,8 +396,9 @@ meta_create(BuildMon *pbm, GNode *gn) char *fname; const char *cp; char *p[4]; /* >= possible uses */ - int i; + int ii; struct stat fs; + unsigned j, num; /* This may be a phony node which we don't want meta data for... */ @@ -417,10 +414,10 @@ meta_create(BuildMon *pbm, GNode *gn) mf.fp = NULL; - i = 0; + ii = 0; - dname = Var_Value(".OBJDIR", gn, &p[i++]); - tname = Var_Value(TARGET, gn, &p[i++]); + dname = Var_Value(".OBJDIR", gn, &p[ii++]); + tname = Var_Value(TARGET, gn, &p[ii++]); /* The object directory may not exist. Check it.. */ if (stat(dname, &fs) != 0) { @@ -430,7 +427,7 @@ meta_create(BuildMon *pbm, GNode *gn) goto out; } /* Check if there are no commands to execute. */ - if (Lst_IsEmpty(gn->commands)) { + if (stringarray_num(&gn->commands) == 0) { if (DEBUG(META)) fprintf(debug_file, "Skipping meta for %s: no commands\n", gn->name); @@ -450,11 +447,14 @@ meta_create(BuildMon *pbm, GNode *gn) } if (!(gn->type & OP_META)) { /* We do not generate .meta files for sub-makes */ - if (Lst_ForEach(gn->commands, is_submake, gn)) { - if (DEBUG(META)) - fprintf(debug_file, "Skipping meta for %s: .MAKE\n", + num = stringarray_num(&gn->commands); + for (j=0; j<num; j++) { + if (is_submake(stringarray_get(&gn->commands, j), gn)) { + if (DEBUG(META)) + fprintf(debug_file, "Skipping meta for %s: .MAKE\n", gn->name); - goto out; + goto out; + } } } @@ -498,7 +498,10 @@ meta_create(BuildMon *pbm, GNode *gn) mf.gn = gn; - Lst_ForEach(gn->commands, printCMD, &mf); + num = stringarray_num(&gn->commands); + for (j=0; j<num; j++) { + printCMD(stringarray_get(&gn->commands, j), &mf); + } fprintf(mf.fp, "CWD %s\n", getcwd(buf, sizeof(buf))); fprintf(mf.fp, "TARGET %s\n", tname); @@ -519,9 +522,9 @@ meta_create(BuildMon *pbm, GNode *gn) gn->type |= OP_SILENT; } out: - for (i--; i >= 0; i--) { - if (p[i]) - free(p[i]); + for (ii--; ii >= 0; ii--) { + if (p[ii]) + free(p[ii]); } return (mf.fp); @@ -588,10 +591,10 @@ meta_init(const char *make_mode) /* * We consider ourselves master of all within ${.MAKE.META.BAILIWICK} */ - metaBailiwick = Lst_Init(FALSE); + stringarray_init(&metaBailiwick); cp = Var_Subst(NULL, "${.MAKE.META.BAILIWICK:O:u:tA}", VAR_GLOBAL, 0); if (cp) { - str2Lst_Append(metaBailiwick, cp, NULL); + str2Lst_Append(&metaBailiwick, cp, NULL); } } @@ -793,15 +796,28 @@ fgetLine(char **bufp, size_t *szp, int o } static int -prefix_match(void *p, void *q) +prefix_match(const char *prefix, const char *path) { - const char *prefix = p; - const char *path = q; size_t n = strlen(prefix); return (0 == strncmp(path, prefix, n)); } +static Boolean +path_in_bailiwick(const char *path) +{ + unsigned i, num; + + num = stringarray_num(&metaBailiwick); + for (i=0; i<num; i++) { + if (prefix_match(stringarray_get(&metaBailiwick, i), path)) { + return TRUE; + } + } + return FALSE; +} + +#if 0 /* not used */ static int string_match(const void *p, const void *q) { @@ -810,7 +826,7 @@ string_match(const void *p, const void * return strcmp(p1, p2); } - +#endif /* * When running with 'meta' functionality, a target can be out-of-date @@ -846,12 +862,12 @@ meta_oodate(GNode *gn, Boolean oodate) static size_t tmplen = 0; FILE *fp; Boolean needOODATE = FALSE; - Lst missingFiles; + struct stringarray missingFiles; if (oodate) return oodate; /* we're done */ - missingFiles = Lst_Init(FALSE); + stringarray_init(&missingFiles); /* * We need to check if the target is out-of-date. This includes @@ -876,8 +892,8 @@ meta_oodate(GNode *gn, Boolean oodate) int pid; int f = 0; int x; - LstNode ln; struct stat fs; + unsigned num, pos; if (!buf) { bufsz = 8 * BUFSIZ; @@ -898,7 +914,9 @@ meta_oodate(GNode *gn, Boolean oodate) /* we want to track all the .meta we read */ Var_Append(".MAKE.META.FILES", fname, VAR_GLOBAL); - ln = Lst_First(gn->commands); + num = stringarray_num(&gn->commands); + pos = 0; + while (!oodate && (x = fgetLine(&buf, &bufsz, 0, fp)) > 0) { lineno++; if (buf[x - 1] == '\n') @@ -1021,7 +1039,7 @@ meta_oodate(GNode *gn, Boolean oodate) break; case 'M': /* renaMe */ - if (Lst_IsEmpty(missingFiles)) + if (stringarray_num(&missingFiles) == 0) break; /* 'L' and 'M' put single quotes around the args */ if (*p == '\'') { @@ -1033,11 +1051,14 @@ meta_oodate(GNode *gn, Boolean oodate) } /* FALLTHROUGH */ case 'D': /* unlink */ - if (*p == '/' && !Lst_IsEmpty(missingFiles)) { + if (*p == '/' && stringarray_num(&missingFiles) > 0) { /* remove p from the missingFiles list if present */ - if ((ln = Lst_Find(missingFiles, p, string_match)) != NULL) { - char *tp = Lst_Datum(ln); - Lst_Remove(missingFiles, ln); + unsigned pos2; + + pos2 = stringarray_find(&missingFiles, p); + if (pos2 != ARRAY_NOTFOUND) { + char *tp = stringarray_get(&missingFiles, pos2); + stringarray_remove(&missingFiles, pos2); free(tp); } } @@ -1066,14 +1087,14 @@ meta_oodate(GNode *gn, Boolean oodate) if (*p != '/') break; - if (Lst_IsEmpty(metaBailiwick)) + if (stringarray_num(&metaBailiwick) == 0) break; /* ignore cwd - normal dependencies handle those */ if (strncmp(p, cwd, cwdlen) == 0) break; - if (!Lst_ForEach(metaBailiwick, prefix_match, p)) + if (!path_in_bailiwick(p)) break; /* tmpdir might be within */ @@ -1085,7 +1106,7 @@ meta_oodate(GNode *gn, Boolean oodate) break; if (stat(p, &fs) < 0) { - Lst_AtEnd(missingFiles, bmake_strdup(p)); + stringarray_add(&missingFiles, bmake_strdup(p), NULL); } break; case 'R': /* Read */ @@ -1192,12 +1213,12 @@ meta_oodate(GNode *gn, Boolean oodate) * Compare the current command with the one in the * meta data file. */ - if (ln == NULL) { + if (pos == ARRAY_NOTFOUND) { if (DEBUG(META)) fprintf(debug_file, "%s: %d: there were more build commands in the meta data file than there are now...\n", fname, lineno); oodate = TRUE; } else { - char *cmd = (char *)Lst_Datum(ln); + char *cmd = stringarray_get(&gn->commands, pos); if (!needOODATE) { if (strstr(cmd, "$?")) @@ -1246,14 +1267,17 @@ meta_oodate(GNode *gn, Boolean oodate) oodate = TRUE; } free(cmd); - ln = Lst_Succ(ln); + pos++; + if (pos == stringarray_num(&gn->commands)) { + pos = ARRAY_NOTFOUND; + } } } else if (strcmp(buf, "CWD") == 0) { /* * Check if there are extra commands now * that weren't in the meta data file. */ - if (!oodate && ln != NULL) { + if (!oodate && pos != ARRAY_NOTFOUND) { if (DEBUG(META)) fprintf(debug_file, "%s: %d: there are extra build commands now that weren't in the meta data file\n", fname, lineno); oodate = TRUE; @@ -1267,12 +1291,17 @@ meta_oodate(GNode *gn, Boolean oodate) } fclose(fp); - if (!Lst_IsEmpty(missingFiles)) { + if (stringarray_num(&missingFiles) > 0) { + unsigned i; + if (DEBUG(META)) fprintf(debug_file, "%s: missing files: %s...\n", - fname, (char *)Lst_Datum(Lst_First(missingFiles))); + fname, stringarray_get(&missingFiles, 0)); oodate = TRUE; - Lst_Destroy(missingFiles, (FreeProc *)free); + for (i=0; i<stringarray_num(&missingFiles); i++) { + free(stringarray_get(&missingFiles, i)); + } + stringarray_setsize(&missingFiles, 0); } } else { if ((gn->type & OP_META)) { @@ -1292,6 +1321,7 @@ meta_oodate(GNode *gn, Boolean oodate) if (cp) free(cp); } + stringarray_cleanup(&missingFiles); return oodate; }