#define STRING_BLOCK_SIZE 64
#define CHUNK_SIZE 32
/* ------------------------------------------------------------------------- */
static const char *err_bad_include = "cannot open include file";
static const char *err_include_too_deep = "include file nesting too deep";
/* ------------------------------------------------------------------------- */
static const char *__scanctx_add_filename(struct scan_context *ctx,
const char *filename)
{
unsigned int count = ctx->num_filenames;
const char **f;
for(f = ctx->filenames; count > 0; ++f, --count)
{
if(!strcmp(*f, filename))
{
free((void *)filename);
return(*f); /* already in list */
}
}
if((ctx->num_filenames % CHUNK_SIZE) == 0)
{
ctx->filenames = (const char **)realloc(
(void *)ctx->filenames,
(ctx->num_filenames + CHUNK_SIZE) * sizeof(const char *));
}
ctx->filenames[ctx->num_filenames] = filename;
++ctx->num_filenames;
return(filename);
}
/* ------------------------------------------------------------------------- */
void scanctx_init(struct scan_context *ctx, const char *top_filename)
{
memset(ctx, 0, sizeof(struct scan_context));
if(top_filename)
ctx->top_filename = __scanctx_add_filename(ctx, strdup(top_filename));
}
/* ------------------------------------------------------------------------- */
const char **scanctx_cleanup(struct scan_context *ctx,
unsigned int *num_filenames)
{
int i;
for(i = 0; i < ctx->depth; ++i)
fclose(ctx->streams[i]);
free((void *)(strbuf_release(&(ctx->string))));
*num_filenames = ctx->num_filenames;
return(ctx->filenames);
}
/* ------------------------------------------------------------------------- */
FILE *scanctx_push_include(struct scan_context *ctx, void *buffer,
const char **error)
{
FILE *fp = NULL;
const char *file;
char *full_file = NULL;
*error = NULL;
if(ctx->depth == MAX_INCLUDE_DEPTH)
{
*error = err_include_too_deep;
return(NULL);
}
file = scanctx_take_string(ctx);
if(ctx->config->include_dir)
{
full_file = (char *)malloc(strlen(ctx->config->include_dir) + strlen(file)
+ 2);
strcpy(full_file, ctx->config->include_dir);
strcat(full_file, FILE_SEPARATOR);
strcat(full_file, file);
}
fp = fopen(full_file ? full_file : file, "rt");
free((void *)full_file);
if(fp)
{
ctx->streams[ctx->depth] = fp;
ctx->files[ctx->depth] = __scanctx_add_filename(ctx, file);
ctx->buffers[ctx->depth] = buffer;
++(ctx->depth);
}
else
{
free((void *)file);
*error = err_bad_include;
}
return(fp);
}
/* ------------------------------------------------------------------------- */
void *scanctx_pop_include(struct scan_context *ctx)
{
void *buffer;
if(ctx->depth == 0)
return(NULL); /* stack underflow */
--(ctx->depth);
buffer = ctx->buffers[ctx->depth];
fclose(ctx->streams[ctx->depth]);
return(buffer);
}
/* ------------------------------------------------------------------------- */
char *scanctx_take_string(struct scan_context *ctx)
{
char *r = strbuf_release(&(ctx->string));
return(r ? r : strdup(""));
}
/* ------------------------------------------------------------------------- */
const char *scanctx_current_filename(struct scan_context *ctx)
{
return((ctx->depth == 0) ? ctx->top_filename : ctx->files[ctx->depth - 1]);
}
/* ------------------------------------------------------------------------- */
/* eof */
0:43:10 +0000'>2012-02-26Revert "Clean up debian/rules" | Jonathan McCrohan | 2 | -14/+24 |
2012-02-26 | Use inheritance in package descriptions in debian/control | Jonathan McCrohan | 1 | -2/+0 |
2012-02-22 | Clean up debian/rules | Jonathan McCrohan | 2 | -24/+14 |
2012-02-15 | Upload to experimental.debian/1.4.8-1_exp1 | Jonathan McCrohan | 1 | -1/+1 |
2012-02-12 | Nitpicky typos. | Jonathan McCrohan | 2 | -3/+3 |
2012-02-12 | Make changes as per JCristau's advice. | Jonathan McCrohan | 1 | -9/+3 |
2012-02-11 | Remove unused entries from debian/rules | Jonathan McCrohan | 1 | -2/+0 |
2012-02-11 | Fix typo in bugclose changelog | Jonathan McCrohan | 1 | -1/+1 |
2012-02-11 | Fix typo in libconfig++dev.examples | Jonathan McCrohan | 1 | -3/+3 |
2012-02-11 | Update changelog. | Jonathan McCrohan | 1 | -2/+5 |
2012-02-11 | Remove forced install of examples in rules. | Jonathan McCrohan | 1 | -2/+2 |
2012-02-11 | Fix Examples. | Jonathan McCrohan | 6 | -34/+17 |
2012-02-11 | Remove makefile. | Jonathan McCrohan | 1 | -7/+0 |
2012-02-11 | Move *.docs, *.install and *.examples to -dev. | Jonathan McCrohan | 7 | -2/+2 |
2012-02-11 | Move to single -dev package. | Jonathan McCrohan | 2 | -14/+12 |
2012-02-08 | Update package changelog. | Jonathan McCrohan | 1 | -1/+1 |
2012-02-08 | Partial manual revert of move to libconfig*8. | Jonathan McCrohan | 4 | -12/+12 |
2012-02-08 | Add my name to debian copyright. | Jonathan McCrohan | 1 | -2/+3 |
2012-02-08 | Atomic commit. Rollback to libconfig8 packaging names. | Jonathan McCrohan | 10 | -8/+8 |
2012-02-07 | Rename libconfig9 to libconfig8 to aid release team | Jonathan McCrohan | 1 | -14/+14 |
2012-02-07 | Fix "closes typo" | Jonathan McCrohan | 1 | -1/+1 |
2012-02-07 | Revert "Add symbols" | Jonathan McCrohan | 3 | -739/+1 |
2012-02-07 | Revert "Fix b0rked symbol file." | Jonathan McCrohan | 1 | -1/+1 |
2012-02-07 | Revert "Second attempt" | Jonathan McCrohan | 2 | -0/+194 |
2012-01-29 | Second attempt | Jonathan McCrohan | 2 | -194/+0 |
2012-01-29 | Fix b0rked symbol file. | Jonathan McCrohan | 1 | -1/+1 |
2012-01-29 | Add symbols | Jonathan McCrohan | 3 | -1/+739 |
2012-01-26 | add examples properly | Jonathan McCrohan | 1 | -0/+2 |
2012-01-26 | Update changelog | Jonathan McCrohan | 1 | -3/+6 |
2012-01-26 | fix typo | Jonathan McCrohan | 1 | -1/+1 |
2012-01-26 | fix accidental description changes | Jonathan McCrohan | 1 | -2/+2 |
2012-01-26 | more fucking around to please lintian | Jonathan McCrohan | 1 | -5/+2 |
2012-01-25 | Linitan fixes | Jonathan McCrohan | 2 | -3/+2 |
2012-01-25 | Split out debug packages | Jonathan McCrohan | 2 | -1/+6 |
2011-12-31 | Fix debian/rules | Jonathan McCrohan | 1 | -1/+1 |
2011-12-31 | Remove shlibs | Jonathan McCrohan | 1 | -2/+0 |
2011-12-31 | Remove NMU from changelog | Jonathan McCrohan | 1 | -1/+0 |
2011-12-31 | Lintian Fixes | Jonathan McCrohan | 1 | -2/+4 |
2011-12-31 | Remove Makefile patch | Jonathan McCrohan | 1 | -1/+0 |
2011-12-31 | Update Makefiles | Jonathan McCrohan | 10 | -248/+8222 |
2011-12-31 | Updated makefiles | Jonathan McCrohan | 1 | -0/+1 |