From: Michael Tremer Date: Fri, 31 May 2019 04:27:08 +0000 (+0100) Subject: libpakfire: parser: Handle templates X-Git-Tag: 0.9.28~1285^2~1018 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=34196c22b98bd7470e4ec0b7e6403c8abdb8e326;p=people%2Fms%2Fpakfire.git libpakfire: parser: Handle templates Signed-off-by: Michael Tremer --- diff --git a/src/libpakfire/parser/scanner.l b/src/libpakfire/parser/scanner.l index 442c751bd..90250a214 100644 --- a/src/libpakfire/parser/scanner.l +++ b/src/libpakfire/parser/scanner.l @@ -25,6 +25,7 @@ int num_lines; +#include #include #include #include "grammar.h" @@ -45,7 +46,8 @@ word ({quoted_string}|({digit}|{letter}|{special})+) We automatically prepend "define" in front of some keywords, because generally the language requires it. */ -keywords (description|{whitespace}(build(_cmds)?|install(_cmds)?|prepare_cmds|requires)) +keywords (description|{whitespace}(build(_cmds)?|files|install(_cmds)?|prepare_cmds|provides|(pre)?requires|_posttrans)) +template {whitespace}template.*$ %s DEFINE @@ -55,6 +57,29 @@ keywords (description|{whitespace}(build(_cmds)?|install(_cmds)?|prepare_cmds|r {whitespace} {} \n { num_lines++; return T_EOL; } +^{template} { + // Find the name of the template + char* name = NULL; + for (unsigned int i = yyleng; i > 0; i--) { + if (isspace(yytext[i])) + break; + + name = yytext + i; + } + + size_t length = strlen("template:") + strlen(name); + + char* buffer = pakfire_malloc(length + 1); + snprintf(buffer, length + 1, "template:%s", name); + + // Put the whole string back onto the stack (backwards) + for (int i = length - 1; i >= 0; i--) { + unput(buffer[i]); + } + + pakfire_free(buffer); + } + ^{keywords}$ { // Determine the length of the string size_t length = strlen("define ") + yyleng;