/* ----------------------------------------------------------------------------
libconfig - A library for processing structured configuration files
- Copyright (C) 2005-2014 Mark A Lindner
+ Copyright (C) 2005-2015 Mark A Lindner
This file is part of libconfig.
/* ------------------------------------------------------------------------- */
FILE *scanctx_push_include(struct scan_context *ctx, void *buffer,
- const char *file, const char **error)
+ const char *file, const char **error)
{
FILE *fp = NULL;
ctx->files[ctx->depth] = __scanctx_add_filename(ctx, file);
ctx->buffers[ctx->depth] = buffer;
++(ctx->depth);
- *error = NULL;
+ *error = NULL;
}
else
{
const char *name;
const char *full_path = NULL;
- name = scanctx_take_string(ctx);
- if(FILE_SEPARATOR[0]!=name[0] && ctx->config->include_dir)
- full_path = scanctx_filename(ctx, ctx->config->include_dir, name);
- else
- full_path = strdup(name);
- free((void*)name);
- return full_path;
+ name = scanctx_take_string(ctx);
+ if((name[0] != FILE_SEPARATOR[0]) && ctx->config->include_dir)
+ {
+ full_path = scanctx_filename(ctx, ctx->config->include_dir, name);
+ free((void*)name);
+ }
+ else
+ full_path = name;
+
+ return full_path;
}
const char *scanctx_filename(struct scan_context *ctx,const char* dirname, const char* filename)
{
- const char* basedir = (NULL!=dirname)? dirname : ctx->basedir;
+ const char *basedir = dirname ? dirname : ctx->basedir;
char *full_file = (char *)malloc(strlen(basedir) + strlen(filename) + 2);
- strcpy(full_file, basedir);
- strcat(full_file, FILE_SEPARATOR);
- strcat(full_file, filename);
+ strcpy(full_file, basedir);
+ strcat(full_file, FILE_SEPARATOR);
+ strcat(full_file, filename);
- return full_file;
+ return full_file;
}
/* ------------------------------------------------------------------------- */
--(ctx->depth);
buffer = ctx->buffers[ctx->depth];
- if(NULL!=ctx->streams[ctx->depth])
- fclose(ctx->streams[ctx->depth]);
+ if(ctx->streams[ctx->depth])
+ fclose(ctx->streams[ctx->depth]);
return(buffer);
}
/* ------------------------------------------------------------------------- */
-extern const char* scanctx_dirnext(struct scan_context* ctx)
+extern const char *scanctx_dirnext(struct scan_context* ctx)
{
- struct dirent** dentries= (struct dirent**)ctx->dentries;
- if( NULL == ctx->dentries || ctx->de_cur==ctx->de_max ) /* shouldn't happen.... */
- return NULL;
+ struct dirent** dentries = (struct dirent**)ctx->dentries;
+ if(!ctx->dentries || (ctx->de_cur == ctx->de_max)) /* shouldn't happen.... */
+ return NULL;
- return dentries[ ctx->de_cur++ ]->d_name;
+ return dentries[ctx->de_cur++]->d_name;
}
int scanctx_dirscan(struct scan_context* ctx, const char* dirname,
- int (*filter)(const struct dirent *),
- int (*compar)(const struct dirent **, const struct dirent **))
+ int (*filter)(const struct dirent *),
+ int (*compar)(const struct dirent **, const struct dirent **))
{
- int n;
+ int n;
- if( NULL == dirname )
- return -1;
+ if(!dirname)
+ return -1;
- ctx->dentries=NULL;
- if( (n=scandir(dirname,(struct dirent***)&ctx->dentries,filter,compar)) < 0)
- return n;
+ ctx->dentries = NULL;
+ if((n = scandir(dirname, (struct dirent***)&ctx->dentries, filter, compar)) < 0)
+ return n;
- ctx->basedir=dirname;
- ctx->de_max=n;
- ctx->de_cur=0;
+ ctx->basedir = dirname;
+ ctx->de_max = n;
+ ctx->de_cur = 0;
- return n;
+ return n;
}
-int scanctx_dirend(struct scan_context* ctx)
+void scanctx_dirend(struct scan_context* ctx)
{
- struct dirent** dentries= (struct dirent**)ctx->dentries;
- unsigned i;
+ struct dirent **dentries = (struct dirent**)ctx->dentries;
+ unsigned i;
- for(i=0; i<ctx->de_max; i++)
- free(dentries[i]);
- free(ctx->dentries);
- ctx->dentries=NULL;
+ for(i = 0; i < ctx->de_max; i++)
+ free(dentries[i]);
+ free(ctx->dentries);
+ ctx->dentries = NULL;
- if(ctx->basedir)
- free((void*)ctx->basedir);
- ctx->de_cur=ctx->de_max=0;
+ if(ctx->basedir)
+ free((void*)ctx->basedir);
- return 0;
+ ctx->de_cur = ctx->de_max = 0;
}
+
int scanctx_inloop(const struct scan_context* ctx)
{
- if( NULL == ctx->dentries )
- return 0;
+ if(!ctx->dentries)
+ return 0;
- return (ctx->de_cur < ctx->de_max)? 1 : 0;
+ return (ctx->de_cur < ctx->de_max) ? 1 : 0;
}
/* ------------------------------------------------------------------------- */
#ifdef _DIRENT_HAVE_D_TYPE
/* filter out non-files and non-symlinks */
- if( DT_REG!=de->d_type && DT_LNK!=de->d_type
- && DT_UNKNOWN!=de->d_type )
- return 0;
+ if((de->d_type != DT_REG) && (de->d_type != DT_LNK) && (de->d_type != DT_UNKNOWN))
+ return 0;
#endif
- return ( NULL != fname
- && '\0' != fname[0] /* can't really happen */
- && '.' != fname[0] ) ? 1 : 0 ;
+ return (fname /* != NULL */
+ && ('\0' != fname[0]) /* can't really happen */
+ && ('.' != fname[0])
+ ) ? 1 : 0 ;
}
%}
return(TOK_STRING);
}
-{include_file_open} { BEGIN INCLUDE_F; }
-<INCLUDE_F>[^\"\\]+ { scanctx_append_string(yyextra, yytext); }
-<INCLUDE_F>\\\\ { scanctx_append_string(yyextra, "\\"); }
-<INCLUDE_F>\\\" { scanctx_append_string(yyextra, "\""); }
-<INCLUDE_F>\" {
+{include_file_open} { BEGIN INCLUDE_F; }
+<INCLUDE_F>[^\"\\]+ { scanctx_append_string(yyextra, yytext); }
+<INCLUDE_F>\\\\ { scanctx_append_string(yyextra, "\\"); }
+<INCLUDE_F>\\\" { scanctx_append_string(yyextra, "\""); }
+<INCLUDE_F>\" {
+ const char *error;
+ FILE *fp = scanctx_push_include(yyextra,
+ (void *)YY_CURRENT_BUFFER,
+ scanctx_getpath(yyextra),
+ &error);
+ if(fp)
+ {
+ yyin = fp;
+ yy_switch_to_buffer(
+ yy_create_buffer(yyin, YY_BUF_SIZE, yyscanner),
+ yyscanner
+ );
+ }
+ else
+ {
+ yyextra->config->error_text = error;
+ yyextra->config->error_file = scanctx_current_filename(
+ yyextra);
+ yyextra->config->error_line = libconfig_yyget_lineno(yyscanner);
+ return TOK_ERROR;
+ }
+ BEGIN INITIAL;
+ }
+
+{include_dir_open} { BEGIN INCLUDE_D; }
+<INCLUDE_D>[^\"\\]+ { scanctx_append_string(yyextra, yytext); }
+<INCLUDE_D>\\\\ { scanctx_append_string(yyextra, "\\"); }
+<INCLUDE_D>\\\" { scanctx_append_string(yyextra, "\""); }
+<INCLUDE_D>\" {
const char *error;
- FILE *fp = scanctx_push_include(yyextra,
- (void *)YY_CURRENT_BUFFER,
- scanctx_getpath(yyextra),
- &error);
- if(fp)
- {
- yyin = fp;
- yy_switch_to_buffer(
- yy_create_buffer(yyin, YY_BUF_SIZE, yyscanner),
- yyscanner
- );
- }
- else
- {
- yyextra->config->error_text = error;
- yyextra->config->error_file = scanctx_current_filename(
- yyextra);
- yyextra->config->error_line = libconfig_yyget_lineno(
- yyscanner);
- return TOK_ERROR;
- }
- BEGIN INITIAL;
- }
-
-{include_dir_open} { BEGIN INCLUDE_D; }
-<INCLUDE_D>[^\"\\]+ { scanctx_append_string(yyextra, yytext); }
-<INCLUDE_D>\\\\ { scanctx_append_string(yyextra, "\\"); }
-<INCLUDE_D>\\\" { scanctx_append_string(yyextra, "\""); }
-<INCLUDE_D>\" {
- const char *error;
- const char* basedir;
- FILE *fp = NULL;
-
- basedir = scanctx_getpath(yyextra);
- if( scanctx_dirscan(yyextra, basedir, filter_dotfiles, alphasort) < 0 )
- {
- if(basedir)
- free((void*)basedir);
- return TOK_ERROR;
- }
-
- if( scanctx_inloop(yyextra) )
- {
- fp = scanctx_push_include(yyextra,
- (void *)YY_CURRENT_BUFFER,
- scanctx_filename(yyextra, NULL, scanctx_dirnext(yyextra)),
- &error);
-
- if(fp)
- {
- yyin = fp;
- yy_switch_to_buffer(
- yy_create_buffer(yyin, YY_BUF_SIZE, yyscanner),
- yyscanner
- );
- }
- else
- {
- yyextra->config->error_text = error;
- yyextra->config->error_file = scanctx_current_filename(
- yyextra);
- yyextra->config->error_line = libconfig_yyget_lineno(
- yyscanner);
- }
- }
- else
- scanctx_dirend(yyextra); /* avoid leaks */
-
- BEGIN INITIAL;
- }
-
+ const char* basedir;
+ FILE *fp = NULL;
+
+ basedir = scanctx_getpath(yyextra);
+ if(scanctx_dirscan(yyextra, basedir, filter_dotfiles, alphasort) < 0)
+ {
+ if(basedir)
+ free((void*)basedir);
+ return TOK_ERROR;
+ }
+
+ if(scanctx_inloop(yyextra))
+ {
+ fp = scanctx_push_include(yyextra,
+ (void *)YY_CURRENT_BUFFER,
+ scanctx_filename(yyextra, NULL, scanctx_dirnext(yyextra)),
+ &error
+ );
+
+ if(fp)
+ {
+ yyin = fp;
+ yy_switch_to_buffer(
+ yy_create_buffer(yyin, YY_BUF_SIZE, yyscanner),
+ yyscanner
+ );
+ }
+ else
+ {
+ yyextra->config->error_text = error;
+ yyextra->config->error_file = scanctx_current_filename(yyextra);
+ yyextra->config->error_line = libconfig_yyget_lineno(yyscanner);
+ }
+ }
+ else
+ scanctx_dirend(yyextra); /* avoid leaks */
+
+ BEGIN INITIAL;
+ }
\n|\r|\f { /* ignore */ }
[ \t]+ { /* ignore */ }
llval = atoll(yytext);
if((llval < INT_MIN) || (llval > INT_MAX))
{
- yylval->llval = llval;
- return(TOK_INTEGER64);
+ yylval->llval = llval;
+ return(TOK_INTEGER64);
}
else
{
- yylval->ival = llval;
- return(TOK_INTEGER);
+ yylval->ival = llval;
+ return(TOK_INTEGER);
}
}
{integer64} { yylval->llval = atoll(yytext); return(TOK_INTEGER64); }
<<EOF>> {
const char* error;
- FILE* fp;
- YY_BUFFER_STATE buf = (YY_BUFFER_STATE)scanctx_pop_include(yyextra);
- if(buf)
- {
- yy_delete_buffer(YY_CURRENT_BUFFER, yyscanner);
- yy_switch_to_buffer(buf, yyscanner);
- }
- else /* if no more buffers, we are done */
- yyterminate();
-
- if( scanctx_inloop(yyextra) )
- {
- /* gotta keep looping.... */
- fp = scanctx_push_include(yyextra,
- (void *)YY_CURRENT_BUFFER,
- scanctx_filename(yyextra, NULL, scanctx_dirnext(yyextra)),
- &error);
- if(fp)
- {
- yyin = fp;
- yy_switch_to_buffer(
- yy_create_buffer(yyin, YY_BUF_SIZE, yyscanner),
- yyscanner
- );
- }
- else
- {
- yyextra->config->error_text = error;
- yyextra->config->error_file = scanctx_current_filename(yyextra);
- yyextra->config->error_line = libconfig_yyget_lineno(yyscanner);
- }
- }
- else /* not on loop, or just finished */
- scanctx_dirend(yyextra);
- }
+ FILE *fp;
+ YY_BUFFER_STATE buf = (YY_BUFFER_STATE)scanctx_pop_include(yyextra);
+ if(buf)
+ {
+ yy_delete_buffer(YY_CURRENT_BUFFER, yyscanner);
+ yy_switch_to_buffer(buf, yyscanner);
+ }
+ else /* if no more buffers, we are done */
+ yyterminate();
+
+ if(scanctx_inloop(yyextra))
+ {
+ /* gotta keep looping.... */
+ fp = scanctx_push_include(yyextra,
+ (void *)YY_CURRENT_BUFFER,
+ scanctx_filename(yyextra, NULL, scanctx_dirnext(yyextra)),
+ &error
+ );
+ if(fp)
+ {
+ yyin = fp;
+ yy_switch_to_buffer(
+ yy_create_buffer(yyin, YY_BUF_SIZE, yyscanner),
+ yyscanner
+ );
+ }
+ else
+ {
+ yyextra->config->error_text = error;
+ yyextra->config->error_file = scanctx_current_filename(yyextra);
+ yyextra->config->error_line = libconfig_yyget_lineno(yyscanner);
+ }
+ }
+ else /* not on loop, or just finished */
+ scanctx_dirend(yyextra);
+ }