extern int yylex(union YYSTYPE *val, struct YYLTYPE *loc, void *scanner);
+static void
+yyerror(struct YYLTYPE *loc, struct parser_param *param, const char *msg)
+{
+ scanner_error(loc, param->scanner, msg);
+}
+
#define scanner param->scanner
%}
}
| MergeMode STRING
{
- $$= &IncludeCreate($2,$1)->common;
+ $$= &IncludeCreate(param->ctx, $2, $1)->common;
free($2);
}
;
FreeInclude(IncludeStmt *incl);
IncludeStmt *
-IncludeCreate(char *str, enum merge_mode merge)
+IncludeCreate(struct xkb_context *ctx, char *str, enum merge_mode merge)
{
IncludeStmt *incl, *first;
char *file, *map, *stmt, *tmp, *extra_data;
}
if (!incl) {
- WSGO("Allocation failure in IncludeCreate\n");
- ACTION("Using only part of the include\n");
+ log_wsgo(ctx,
+ "Allocation failure in IncludeCreate; "
+ "Using only part of the include\n");
break;
}
return first;
err:
- ERROR("Illegal include statement \"%s\"\n", stmt);
- ACTION("Ignored\n");
+ log_err(ctx, "Illegal include statement \"%s\"; Ignored\n", stmt);
FreeInclude(first);
free(stmt);
return NULL;
}
void
-CheckDefaultMap(XkbFile * maps, const char *fileName)
+CheckDefaultMap(struct xkb_context *ctx, XkbFile *maps, const char *fileName)
{
- XkbFile *dflt, *tmp;
-
- dflt = NULL;
- for (tmp = maps, dflt = NULL; tmp != NULL;
- tmp = (XkbFile *) tmp->common.next) {
- if (tmp->flags & XkbLC_Default) {
- if (dflt == NULL)
- dflt = tmp;
- else {
- if (warningLevel > 2) {
- WARN("Multiple default components in %s\n",
- (fileName ? fileName : "(unknown)"));
- ACTION("Using %s, ignoring %s\n",
- (dflt->name ? dflt->name : "(first)"),
- (tmp->name ? tmp->name : "(subsequent)"));
- }
- tmp->flags &= (~XkbLC_Default);
- }
+ XkbFile *dflt = NULL, *tmp;
+
+ for (tmp = maps; tmp; tmp = (XkbFile *) tmp->common.next) {
+ if (!(tmp->flags & XkbLC_Default))
+ continue;
+ if (!dflt) {
+ dflt = tmp;
+ continue;
}
+
+ log_lvl(ctx, 3,
+ "Multiple default components in %s; "
+ "Using %s, ignoring %s\n",
+ (fileName ? fileName : "(unknown)"),
+ (dflt->name ? dflt->name : "(first)"),
+ (tmp->name ? tmp->name : "(subsequent)"));
+
+ tmp->flags &= (~XkbLC_Default);
}
}
case ExprKeysymList:
darray_foreach(sym, expr->value.list.syms)
- free(*sym);
+ free(*sym);
darray_free(expr->value.list.syms);
darray_free(expr->value.list.symsMapIndex);
darray_free(expr->value.list.symsNumEntries);
#include "parser.h"
struct scanner_extra {
+ struct xkb_context *ctx;
char *scanFile;
char scanBuf[1024];
char *s;
LookupKeysym(const char *str, xkb_keysym_t *sym_rtrn);
extern IncludeStmt *
-IncludeCreate(char *str, enum merge_mode merge);
+IncludeCreate(struct xkb_context *ctx, char *str, enum merge_mode merge);
extern void
-CheckDefaultMap(XkbFile *maps, const char *fileName);
+CheckDefaultMap(struct xkb_context *ctx, XkbFile *maps, const char *fileName);
extern XkbFile *
CreateXKBFile(struct xkb_context *ctx, enum xkb_file_type type, char *name,
extern void
FreeStmt(ParseCommon *stmt);
-extern void
-yyerror(struct YYLTYPE *loc, void *scanner, const char *msg);
+void
+scanner_error(struct YYLTYPE *loc, void *scanner, const char *msg);
#endif /* PARSEUTILS_H */
extern int yyparse(struct parser_param *param);
+static void
+scanner_error_extra(struct YYLTYPE *loc, struct scanner_extra *extra,
+ const char *msg);
+
#define YY_USER_ACTION { \
yylloc->first_line = yylineno; \
yylloc->last_line = yylineno; \
(void) sscanf( yytext + 1, "%o", &result );
if (result > 0xff) {
- fprintf(stderr, "Illegal octal escape %s\n", yytext);
+ scanner_error_extra(yylloc, yyextra,
+ "Illegal octal escape");
return ERROR_TOK;
}
}
<S_STR,S_KEY>\\[0-9]+ {
- fprintf(stderr, "Illegal octal escape %s\n", yytext);
+ scanner_error_extra(yylloc, yyextra,
+ "Illegal octal escape");
return ERROR_TOK;
}
%%
+static void
+scanner_error_extra(struct YYLTYPE *loc, struct scanner_extra *extra,
+ const char *msg)
+{
+ log_err(extra->ctx, "%s: line %d of %s\n", msg,
+ loc->first_line,
+ extra->scanFile ? extra->scanFile : "(unknown)");
+
+ log_err(extra->ctx, "last scanned symbol was: %s\n",
+ extra->scanBuf);
+}
+
void
-yyerror(struct YYLTYPE *loc, void *scanner, const char *msg)
+scanner_error(struct YYLTYPE *loc, void *scanner, const char *msg)
{
struct scanner_extra *extra = yyget_extra(scanner);
-
- if (warningLevel > 0) {
- fprintf(stderr, "%s: line %d of %s\n", msg, loc->first_line,
- extra->scanFile ? extra->scanFile : "(unknown)");
- if (warningLevel > 3)
- fprintf(stderr, "last scanned symbol is: %s\n", extra->scanBuf);
- }
+ scanner_error_extra(loc, extra, msg);
}
bool
if (ret != 0)
return false;
+ extra.ctx = ctx;
+
extra.scanFile = strdup(file_name);
if (!extra.scanFile)
return false;
if (ret != 0)
return false;
- CheckDefaultMap(param.rtrn, file_name);
+ CheckDefaultMap(param.ctx, param.rtrn, file_name);
*out = param.rtrn;
return true;
}
if (ret != 0)
return false;
+ extra.ctx = ctx;
+
extra.scanFile = strdup(file_name);
if (!extra.scanFile)
return false;
if (ret != 0)
return false;
- CheckDefaultMap(param.rtrn, file_name);
+ CheckDefaultMap(param.ctx, param.rtrn, file_name);
*out = param.rtrn;
return true;
}
XkbFile *keycodes, *types, *compat, *symbols;
IncludeStmt *inc;
- inc = IncludeCreate(ktcsg->keycodes, MERGE_DEFAULT);
+ inc = IncludeCreate(ctx, ktcsg->keycodes, MERGE_DEFAULT);
keycodes = CreateXKBFile(ctx, FILE_TYPE_KEYCODES, NULL,
(ParseCommon *) inc, 0);
- inc = IncludeCreate(ktcsg->types, MERGE_DEFAULT);
+ inc = IncludeCreate(ctx, ktcsg->types, MERGE_DEFAULT);
types = CreateXKBFile(ctx, FILE_TYPE_TYPES, NULL,
(ParseCommon *) inc, 0);
AppendStmt(&keycodes->common, &types->common);
- inc = IncludeCreate(ktcsg->compat, MERGE_DEFAULT);
+ inc = IncludeCreate(ctx, ktcsg->compat, MERGE_DEFAULT);
compat = CreateXKBFile(ctx, FILE_TYPE_COMPAT, NULL,
(ParseCommon *) inc, 0);
AppendStmt(&keycodes->common, &compat->common);
- inc = IncludeCreate(ktcsg->symbols, MERGE_DEFAULT);
+ inc = IncludeCreate(ctx, ktcsg->symbols, MERGE_DEFAULT);
symbols = CreateXKBFile(ctx, FILE_TYPE_SYMBOLS, NULL,
(ParseCommon *) inc, 0);
AppendStmt(&keycodes->common, &symbols->common);