#include "system.h"
#include <stdarg.h>
#include <rpmio_internal.h>
#include <rpmmessages.h>
#include <rpmerr.h>
#include <rpmmacro.h>
#include "debug.h"
Go to the source code of this file.
Data Structures | |
struct | MacroBuf_s |
Macro expansion state. More... | |
Defines | |
#define | isblank(_c) ((_c) == ' ' || (_c) == '\t') |
#define | iseol(_c) ((_c) == '\n' || (_c) == '\r') |
#define | STREQ(_t, _f, _fn) ((_fn) == (sizeof(_t)-1) && !strncmp((_t), (_f), (_fn))) |
#define | SAVECHAR(_mb, _c) { *(_mb)->t = (_c), (_mb)->t++, (_mb)->nb--; } |
#define | MAX_MACRO_DEPTH 16 |
#define | MACRO_CHUNK_SIZE 16 |
#define | SKIPBLANK(_s, _c) |
#define | SKIPNONBLANK(_s, _c) |
#define | COPYNAME(_ne, _s, _c) |
#define | COPYOPTS(_oe, _s, _c) |
#define | COPYBODY(_be, _s, _c) |
Typedefs | |
typedef struct MacroBuf_s * | MacroBuf |
Macro expansion state. | |
Functions | |
static int | expandMacro (MacroBuf mb) |
The main macro recursion loop. | |
static void * | _free (const void *p) |
Wrapper to free(3), hides const compilation noise, permit NULL, return NULL. | |
static int | compareMacroName (const void *ap, const void *bp) |
Compare macro entries by name (qsort/bsearch). | |
static void | expandMacroTable (MacroContext mc) |
Enlarge macro table. | |
static void | sortMacroTable (MacroContext mc) |
Sort entries in macro table. | |
void | rpmDumpMacroTable (MacroContext mc, FILE *fp) |
Print macros to file stream. | |
static MacroEntry * | findEntry (MacroContext mc, const char *name, size_t namelen) |
Find entry in macro table. | |
static char * | rdcl (char *buf, size_t size, FD_t fd, int escapes) |
fgets(3) analogue that reads \ continuations. | |
static const char * | matchchar (const char *p, char pl, char pr) |
Return text between pl and matching pr characters. | |
static void | printMacro (MacroBuf mb, const char *s, const char *se) |
Pre-print macro expression to be expanded. | |
static void | printExpansion (MacroBuf mb, const char *t, const char *te) |
Post-print expanded macro expression. | |
static int | expandT (MacroBuf mb, const char *f, size_t flen) |
Save source and expand field into target. | |
static int | expandU (MacroBuf mb, char *u, size_t ulen) |
Save source/target and expand macro in u. | |
static int | doShellEscape (MacroBuf mb, const char *cmd, size_t clen) |
Expand output of shell command into target buffer. | |
static const char * | doDefine (MacroBuf mb, const char *se, int level, int expandbody) |
Parse (and execute) new macro definition. | |
static const char * | doUndefine (MacroContext mc, const char *se) |
Parse (and execute) macro undefinition. | |
static void | pushMacro (MacroEntry *mep, const char *n, const char *o, const char *b, int level) |
Push new macro definition onto macro entry stack. | |
static void | popMacro (MacroEntry *mep) |
Pop macro definition from macro entry stack. | |
static void | freeArgs (MacroBuf mb) |
Free parsed arguments for parameterized macro. | |
static const char * | grabArgs (MacroBuf mb, const MacroEntry me, const char *se, char lastc) |
Parse arguments (to next new line) for parameterized macro. | |
static void | doOutput (MacroBuf mb, int waserror, const char *msg, size_t msglen) |
Perform macro message output. | |
static void | doFoo (MacroBuf mb, int negate, const char *f, size_t fn, const char *g, size_t glen) |
Execute macro primitives. | |
int | expandMacros (void *spec, MacroContext mc, char *sbuf, size_t slen) |
Expand macro into buffer. | |
void | addMacro (MacroContext mc, const char *n, const char *o, const char *b, int level) |
Add macro to context. | |
void | delMacro (MacroContext mc, const char *n) |
Delete macro from context. | |
int | rpmDefineMacro (MacroContext mc, const char *macro, int level) |
Define macro in context. | |
void | rpmLoadMacros (MacroContext mc, int level) |
Load macros from specific context into global context. | |
void | rpmInitMacros (MacroContext mc, const char *macrofiles) |
Initialize global macro context from set of macrofile(s). | |
void | rpmFreeMacros (MacroContext mc) |
Destroy macro context. | |
int | isCompressed (const char *file, rpmCompressedMagic *compressed) |
Return type of compression used in file. | |
char * | rpmExpand (const char *arg,...) |
Return (malloc'ed) concatenated macro expansion(s). | |
int | rpmExpandNumeric (const char *arg) |
Return macro expansion as a numeric value. | |
char * | rpmCleanPath (char *path) |
Canonicalize file path. | |
const char * | rpmGetPath (const char *path,...) |
Return (malloc'ed) expanded, canonicalized, file path. | |
const char * | rpmGenPath (const char *urlroot, const char *urlmdir, const char *urlfile) |
Merge 3 args into path, any or all of which may be a url. | |
Variables | |
static int | _debug = 0 |
static struct MacroContext_s | rpmGlobalMacroContext_s |
MacroContext | rpmGlobalMacroContext = &rpmGlobalMacroContext_s |
static struct MacroContext_s | rpmCLIMacroContext_s |
MacroContext | rpmCLIMacroContext = &rpmCLIMacroContext_s |
int | max_macro_depth = 16 |
int | print_macro_trace = 0 |
int | print_expand_trace = 0 |
Definition in file macro.c.
#define COPYBODY | ( | _be, | |||
_s, | |||||
_c | ) |
#define COPYNAME | ( | _ne, | |||
_s, | |||||
_c | ) |
#define COPYOPTS | ( | _oe, | |||
_s, | |||||
_c | ) |
#define SAVECHAR | ( | _mb, | |||
_c | ) | { *(_mb)->t = (_c), (_mb)->t++, (_mb)->nb--; } |
#define SKIPBLANK | ( | _s, | |||
_c | ) |
#define SKIPNONBLANK | ( | _s, | |||
_c | ) |
#define STREQ | ( | _t, | |||
_f, | |||||
_fn | ) | ((_fn) == (sizeof(_t)-1) && !strncmp((_t), (_f), (_fn))) |
typedef struct MacroBuf_s * MacroBuf |
Macro expansion state.
static void* _free | ( | const void * | p | ) | [inline, static] |
void addMacro | ( | MacroContext | mc, | |
const char * | n, | |||
const char * | o, | |||
const char * | b, | |||
int | level | |||
) |
Add macro to context.
mc | macro context (NULL uses global context). | |
n | macro name | |
o | macro paramaters | |
b | macro body | |
level | macro recursion level (0 is entry API) |
static int compareMacroName | ( | const void * | ap, | |
const void * | bp | |||
) | [static] |
void delMacro | ( | MacroContext | mc, | |
const char * | n | |||
) |
static const char* doDefine | ( | MacroBuf | mb, | |
const char * | se, | |||
int | level, | |||
int | expandbody | |||
) | [static] |
static void doFoo | ( | MacroBuf | mb, | |
int | negate, | |||
const char * | f, | |||
size_t | fn, | |||
const char * | g, | |||
size_t | glen | |||
) | [static] |
static void doOutput | ( | MacroBuf | mb, | |
int | waserror, | |||
const char * | msg, | |||
size_t | msglen | |||
) | [static] |
Perform macro message output.
mb | macro expansion state | |
waserror | use rpmError()? | |
msg | message to ouput | |
msglen | no. of bytes in message |
static int doShellEscape | ( | MacroBuf | mb, | |
const char * | cmd, | |||
size_t | clen | |||
) | [static] |
static const char* doUndefine | ( | MacroContext | mc, | |
const char * | se | |||
) | [static] |
static int expandMacro | ( | MacroBuf | mb | ) | [static] |
int expandMacros | ( | void * | spec, | |
MacroContext | mc, | |||
char * | sbuf, | |||
size_t | slen | |||
) |
Expand macro into buffer.
spec | cookie (unused) | |
mc | macro context (NULL uses global context). |
sbuf | input macro to expand, output expansion |
slen | size of buffer |
static void expandMacroTable | ( | MacroContext | mc | ) | [static] |
static int expandT | ( | MacroBuf | mb, | |
const char * | f, | |||
size_t | flen | |||
) | [static] |
static int expandU | ( | MacroBuf | mb, | |
char * | u, | |||
size_t | ulen | |||
) | [static] |
static MacroEntry* findEntry | ( | MacroContext | mc, | |
const char * | name, | |||
size_t | namelen | |||
) | [static] |
static void freeArgs | ( | MacroBuf | mb | ) | [static] |
static const char* grabArgs | ( | MacroBuf | mb, | |
const MacroEntry | me, | |||
const char * | se, | |||
char | lastc | |||
) | [static] |
int isCompressed | ( | const char * | file, | |
rpmCompressedMagic * | compressed | |||
) |
static const char* matchchar | ( | const char * | p, | |
char | pl, | |||
char | pr | |||
) | [static] |
static void popMacro | ( | MacroEntry * | mep | ) | [static] |
static void printExpansion | ( | MacroBuf | mb, | |
const char * | t, | |||
const char * | te | |||
) | [static] |
static void printMacro | ( | MacroBuf | mb, | |
const char * | s, | |||
const char * | se | |||
) | [static] |
static void pushMacro | ( | MacroEntry * | mep, | |
const char * | n, | |||
const char * | o, | |||
const char * | b, | |||
int | level | |||
) | [static] |
static char* rdcl | ( | char * | buf, | |
size_t | size, | |||
FD_t | fd, | |||
int | escapes | |||
) | [static] |
char* rpmCleanPath | ( | char * | path | ) |
int rpmDefineMacro | ( | MacroContext | mc, | |
const char * | macro, | |||
int | level | |||
) |
void rpmDumpMacroTable | ( | MacroContext | mc, | |
FILE * | fp | |||
) |
char* rpmExpand | ( | const char * | arg, | |
... | ||||
) |
int rpmExpandNumeric | ( | const char * | arg | ) |
void rpmFreeMacros | ( | MacroContext | mc | ) |
const char* rpmGenPath | ( | const char * | urlroot, | |
const char * | urlmdir, | |||
const char * | urlfile | |||
) |
Merge 3 args into path, any or all of which may be a url.
The leading part of the first URL encountered is used for the result, other URL prefixes are discarded, permitting a primitive form of URL inheiritance.
urlroot | root URL (often path to chroot, or NULL) | |
urlmdir | directory URL (often a directory, or NULL) | |
urlfile | file URL (often a file, or NULL) |
const char* rpmGetPath | ( | const char * | path, | |
... | ||||
) |
void rpmInitMacros | ( | MacroContext | mc, | |
const char * | macrofiles | |||
) |
void rpmLoadMacros | ( | MacroContext | mc, | |
int | level | |||
) |
static void sortMacroTable | ( | MacroContext | mc | ) | [static] |
int max_macro_depth = 16 |
int print_expand_trace = 0 |
int print_macro_trace = 0 |
struct MacroContext_s rpmCLIMacroContext_s [static] |
struct MacroContext_s rpmGlobalMacroContext_s [static] |