make(1): replace PtrVector with Vector, which can contain any type
This commit is contained in:
parent
10febc0902
commit
57a6634b84
|
@ -1,4 +1,4 @@
|
|||
/* $NetBSD: lst.c,v 1.89 2020/10/25 12:08:53 rillig Exp $ */
|
||||
/* $NetBSD: lst.c,v 1.90 2020/10/25 13:06:12 rillig Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1988, 1989, 1990, 1993
|
||||
|
@ -34,7 +34,7 @@
|
|||
|
||||
#include "make.h"
|
||||
|
||||
MAKE_RCSID("$NetBSD: lst.c,v 1.89 2020/10/25 12:08:53 rillig Exp $");
|
||||
MAKE_RCSID("$NetBSD: lst.c,v 1.90 2020/10/25 13:06:12 rillig Exp $");
|
||||
|
||||
static ListNode *
|
||||
LstNodeNew(ListNode *prev, ListNode *next, void *datum)
|
||||
|
@ -275,43 +275,48 @@ Lst_Dequeue(List *list)
|
|||
}
|
||||
|
||||
void
|
||||
PtrVector_Init(PtrVector *v)
|
||||
Vector_Init(Vector *v, size_t itemSize)
|
||||
{
|
||||
v->len = 0;
|
||||
v->cap = 10;
|
||||
v->items = bmake_malloc(v->cap * sizeof v->items[0]);
|
||||
v->priv_cap = 10;
|
||||
v->itemSize = itemSize;
|
||||
v->items = bmake_malloc(v->priv_cap * v->itemSize);
|
||||
}
|
||||
|
||||
Boolean PtrVector_IsEmpty(PtrVector *v)
|
||||
/* Return the pointer to the given item in the vector.
|
||||
* The returned data is valid until the next modifying operation. */
|
||||
void *
|
||||
Vector_Get(Vector *v, size_t i)
|
||||
{
|
||||
return v->len == 0;
|
||||
unsigned char *items = v->items;
|
||||
return items + i * v->itemSize;
|
||||
}
|
||||
|
||||
void PtrVector_Push(PtrVector *v, void *datum)
|
||||
/* Add space for a new item to the vector and return a pointer to that space.
|
||||
* The returned data is valid until the next modifying operation. */
|
||||
void *
|
||||
Vector_Push(Vector *v)
|
||||
{
|
||||
if (v->len >= v->cap) {
|
||||
v->cap *= 2;
|
||||
v->items = bmake_realloc(v->items,
|
||||
v->cap * sizeof v->items[0]);
|
||||
if (v->len >= v->priv_cap) {
|
||||
v->priv_cap *= 2;
|
||||
v->items = bmake_realloc(v->items, v->priv_cap * v->itemSize);
|
||||
}
|
||||
v->items[v->len] = datum;
|
||||
v->len++;
|
||||
return Vector_Get(v, v->len - 1);
|
||||
}
|
||||
|
||||
void *PtrVector_Pop(PtrVector *v)
|
||||
/* Return the pointer to the last item in the vector.
|
||||
* The returned data is valid until the next modifying operation. */
|
||||
void *
|
||||
Vector_Pop(Vector *v)
|
||||
{
|
||||
void *datum;
|
||||
|
||||
assert(v->len > 0);
|
||||
v->len--;
|
||||
datum = v->items[v->len];
|
||||
#ifdef CLEANUP
|
||||
v->items[v->len] = NULL;
|
||||
#endif
|
||||
return datum;
|
||||
return Vector_Get(v, v->len);
|
||||
}
|
||||
|
||||
void PtrVector_Done(PtrVector *v)
|
||||
void
|
||||
Vector_Done(Vector *v)
|
||||
{
|
||||
free(v->items);
|
||||
}
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* $NetBSD: lst.h,v 1.81 2020/10/25 12:08:53 rillig Exp $ */
|
||||
/* $NetBSD: lst.h,v 1.82 2020/10/25 13:06:12 rillig Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1988, 1989, 1990 The Regents of the University of California.
|
||||
|
@ -163,18 +163,19 @@ void Lst_Enqueue(List *, void *);
|
|||
/* Remove the head node of the queue and return its datum. */
|
||||
void *Lst_Dequeue(List *);
|
||||
|
||||
/* A pointer vector is an ordered collection of pointers, allowing for fast
|
||||
* indexed access. */
|
||||
typedef struct PtrVector {
|
||||
void **items;
|
||||
size_t len;
|
||||
size_t cap;
|
||||
} PtrVector;
|
||||
/* A vector is an ordered collection of items, allowing for fast indexed
|
||||
* access. */
|
||||
typedef struct Vector {
|
||||
void *items; /* memory holding the items */
|
||||
size_t itemSize; /* size of a single item in bytes */
|
||||
size_t len; /* number of actually usable elements */
|
||||
size_t priv_cap; /* capacity */
|
||||
} Vector;
|
||||
|
||||
void PtrVector_Init(PtrVector *);
|
||||
Boolean PtrVector_IsEmpty(PtrVector *);
|
||||
void PtrVector_Push(PtrVector *, void *);
|
||||
void *PtrVector_Pop(PtrVector *);
|
||||
void PtrVector_Done(PtrVector *);
|
||||
void Vector_Init(Vector *, size_t);
|
||||
void *Vector_Get(Vector *, size_t);
|
||||
void *Vector_Push(Vector *);
|
||||
void *Vector_Pop(Vector *);
|
||||
void Vector_Done(Vector *);
|
||||
|
||||
#endif /* MAKE_LST_H */
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* $NetBSD: parse.c,v 1.399 2020/10/25 12:08:53 rillig Exp $ */
|
||||
/* $NetBSD: parse.c,v 1.400 2020/10/25 13:06:12 rillig Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1988, 1989, 1990, 1993
|
||||
|
@ -131,7 +131,7 @@
|
|||
#include "pathnames.h"
|
||||
|
||||
/* "@(#)parse.c 8.3 (Berkeley) 3/19/94" */
|
||||
MAKE_RCSID("$NetBSD: parse.c,v 1.399 2020/10/25 12:08:53 rillig Exp $");
|
||||
MAKE_RCSID("$NetBSD: parse.c,v 1.400 2020/10/25 13:06:12 rillig Exp $");
|
||||
|
||||
/* types and constants */
|
||||
|
||||
|
@ -281,7 +281,13 @@ static IFile *curFile;
|
|||
* (not printed since it is below a .for loop)
|
||||
* includes[0]: include-main.mk:27
|
||||
*/
|
||||
static PtrVector /* of IFile pointer */ includes;
|
||||
static Vector /* of IFile pointer */ includes;
|
||||
|
||||
static IFile *
|
||||
GetInclude(size_t i)
|
||||
{
|
||||
return *((IFile **)Vector_Get(&includes, i));
|
||||
}
|
||||
|
||||
/* include paths (lists of directories) */
|
||||
SearchPath *parseIncPath; /* dirs for "..." includes */
|
||||
|
@ -2322,8 +2328,8 @@ GetActuallyIncludingFile(void)
|
|||
size_t i;
|
||||
|
||||
for (i = includes.len; i > 0; i--) {
|
||||
IFile *parent = includes.items[i - 1];
|
||||
IFile *child = i < includes.len ? includes.items[i] : curFile;
|
||||
IFile *parent = GetInclude(i - 1);
|
||||
IFile *child = i < includes.len ? GetInclude(i) : curFile;
|
||||
if (!child->fromForLoop)
|
||||
return parent->fname;
|
||||
}
|
||||
|
@ -2402,9 +2408,11 @@ Parse_SetInput(const char *name, int line, int fd,
|
|||
/* sanity */
|
||||
return;
|
||||
|
||||
if (curFile != NULL)
|
||||
if (curFile != NULL) {
|
||||
/* Save existing file info */
|
||||
PtrVector_Push(&includes, curFile);
|
||||
IFile **next = Vector_Push(&includes);
|
||||
*next = curFile;
|
||||
}
|
||||
|
||||
/* Allocate and fill in new structure */
|
||||
curFile = bmake_malloc(sizeof *curFile);
|
||||
|
@ -2599,7 +2607,7 @@ ParseEOF(void)
|
|||
free(curFile->P_str);
|
||||
free(curFile);
|
||||
|
||||
if (PtrVector_IsEmpty(&includes)) {
|
||||
if (includes.len == 0) {
|
||||
curFile = NULL;
|
||||
/* We've run out of input */
|
||||
Var_Delete(".PARSEDIR", VAR_GLOBAL);
|
||||
|
@ -2609,7 +2617,8 @@ ParseEOF(void)
|
|||
return FALSE;
|
||||
}
|
||||
|
||||
curFile = PtrVector_Pop(&includes);
|
||||
curFile = GetInclude(includes.len - 1);
|
||||
Vector_Pop(&includes);
|
||||
DEBUG2(PARSE, "ParseEOF: returning to file %s, line %d\n",
|
||||
curFile->fname, curFile->lineno);
|
||||
|
||||
|
@ -3147,7 +3156,7 @@ Parse_Init(void)
|
|||
parseIncPath = Lst_New();
|
||||
sysIncPath = Lst_New();
|
||||
defIncPath = Lst_New();
|
||||
PtrVector_Init(&includes);
|
||||
Vector_Init(&includes, sizeof(IFile *));
|
||||
#ifdef CLEANUP
|
||||
targCmds = Lst_New();
|
||||
#endif
|
||||
|
@ -3163,8 +3172,8 @@ Parse_End(void)
|
|||
Lst_Destroy(defIncPath, Dir_Destroy);
|
||||
Lst_Destroy(sysIncPath, Dir_Destroy);
|
||||
Lst_Destroy(parseIncPath, Dir_Destroy);
|
||||
assert(PtrVector_IsEmpty(&includes));
|
||||
PtrVector_Done(&includes);
|
||||
assert(includes.len == 0);
|
||||
Vector_Done(&includes);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* $NetBSD: var.c,v 1.584 2020/10/25 12:08:53 rillig Exp $ */
|
||||
/* $NetBSD: var.c,v 1.585 2020/10/25 13:06:12 rillig Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1988, 1989, 1990, 1993
|
||||
|
@ -121,7 +121,7 @@
|
|||
#include "metachar.h"
|
||||
|
||||
/* "@(#)var.c 8.3 (Berkeley) 3/19/94" */
|
||||
MAKE_RCSID("$NetBSD: var.c,v 1.584 2020/10/25 12:08:53 rillig Exp $");
|
||||
MAKE_RCSID("$NetBSD: var.c,v 1.585 2020/10/25 13:06:12 rillig Exp $");
|
||||
|
||||
#define VAR_DEBUG1(fmt, arg1) DEBUG1(VAR, fmt, arg1)
|
||||
#define VAR_DEBUG2(fmt, arg1, arg2) DEBUG2(VAR, fmt, arg1, arg2)
|
||||
|
@ -3865,24 +3865,26 @@ Var_Stats(void)
|
|||
void
|
||||
Var_Dump(GNode *ctxt)
|
||||
{
|
||||
PtrVector varnames;
|
||||
Vector /* of const char * */ vec;
|
||||
HashIter hi;
|
||||
HashEntry *he;
|
||||
size_t i;
|
||||
const char **varnames;
|
||||
|
||||
PtrVector_Init(&varnames);
|
||||
Vector_Init(&vec, sizeof(const char *));
|
||||
|
||||
HashIter_Init(&hi, &ctxt->context);
|
||||
while ((he = HashIter_Next(&hi)) != NULL)
|
||||
PtrVector_Push(&varnames, he->key);
|
||||
*(const char **)Vector_Push(&vec) = he->key;
|
||||
varnames = vec.items;
|
||||
|
||||
qsort(varnames.items, varnames.len, sizeof varnames.items[0], str_cmp_asc);
|
||||
qsort(varnames, vec.len, sizeof varnames[0], str_cmp_asc);
|
||||
|
||||
for (i = 0; i < varnames.len; i++) {
|
||||
const char *varname = varnames.items[i];
|
||||
for (i = 0; i < vec.len; i++) {
|
||||
const char *varname = varnames[i];
|
||||
Var *var = Hash_FindValue(&ctxt->context, varname);
|
||||
debug_printf("%-16s = %s\n", varname, Buf_GetAll(&var->val, NULL));
|
||||
}
|
||||
|
||||
PtrVector_Done(&varnames);
|
||||
Vector_Done(&vec);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue