expression.c File Reference
RPMBUILD.

Simple logical expression parser. More...

`#include "system.h"`
`#include <rpmio.h>`
`#include <rpmiotypes.h>`
`#include <rpmlog.h>`
`#include <rpmbuild.h>`
`#include "debug.h"`
Include dependency graph for expression.c:

Go to the source code of this file.

## Data Structures

struct | _value
| Encapsulation of a "value". More...
struct | _parseState
| Parser state. More...

## Macros

#define | DEBUG(x)
#define | valueIsInteger(v) ((v)->type == VALUE_TYPE_INTEGER)
#define | valueIsString(v) ((v)->type == VALUE_TYPE_STRING)
#define | valueSameType(v1, v2) ((v1)->type == (v2)->type)
#define | EXPRBUFSIZ BUFSIZ
Parser tokens
#define | TOK_EOF 1
#define | TOK_INTEGER 2
#define | TOK_STRING 3
#define | TOK_IDENTIFIER 4
#define | TOK_ADD 5
#define | TOK_MINUS 6
#define | TOK_MULTIPLY 7
#define | TOK_DIVIDE 8
#define | TOK_OPEN_P 9
#define | TOK_CLOSE_P 10
#define | TOK_EQ 11
#define | TOK_NEQ 12
#define | TOK_LT 13
#define | TOK_LE 14
#define | TOK_GT 15
#define | TOK_GE 16
#define | TOK_NOT 17
#define | TOK_LOGICAL_AND 18
#define | TOK_LOGICAL_OR 19

## Typedefs

typedef struct _value * | Value
| Encapsulation of a "value". More...
typedef struct _parseState * | ParseState
| Parser state. More...

## Functions

static Value | valueMakeInteger (int i)
static Value | valueMakeString (const char *s)
static void | valueFree (Value v)
static int | rdToken (ParseState state)
static Value | doLogical (ParseState state)
static Value | doPrimary (ParseState state)
static Value | doMultiplyDivide (ParseState state)
static Value | doAddSubtract (ParseState state)
static Value | doRelational (ParseState state)
int | parseExpressionBoolean (Spec spec, const char *expr)
| Evaluate boolean expression. More...
char * | parseExpressionString (Spec spec, const char *expr)
| Evaluate string expression. More...

## Detailed Description

Simple logical expression parser.

This module implements a basic expression parser with support for integer and string datatypes. For ease of programming, we use the top-down "recursive descent" method of parsing. While a table-driven bottom-up parser might be faster, it does not really matter for the expressions we will be parsing.

Copyright (C) 1998 Tom Dyas tdyas.nosp@m.@ede.nosp@m.n.rut.nosp@m.gers.nosp@m..edu This work is provided under the GPL or LGPL at your choice.

Definition in file expression.c.

## Macro Definition Documentation

#define DEBUG | ( |  | x | ) |

Definition at line 30 of file expression.c.

Referenced by doAddSubtract(), doLogical(), doMultiplyDivide(), doPrimary(), doRelational(), parseExpressionBoolean(), parseExpressionString(), and rdToken().

#define EXPRBUFSIZ BUFSIZ

Definition at line 143 of file expression.c.

Referenced by rdToken().

#define TOK_ADD 5

Definition at line 126 of file expression.c.

Referenced by doAddSubtract(), and rdToken().

#define TOK_CLOSE_P 10

Definition at line 131 of file expression.c.

Referenced by doPrimary(), and rdToken().

#define TOK_DIVIDE 8

Definition at line 129 of file expression.c.

Referenced by doMultiplyDivide(), and rdToken().

#define TOK_EOF 1

Definition at line 122 of file expression.c.

Referenced by parseExpressionBoolean(), parseExpressionString(), and rdToken().

#define TOK_EQ 11

Definition at line 132 of file expression.c.

Referenced by doRelational(), and rdToken().

#define TOK_GE 16

Definition at line 137 of file expression.c.

Referenced by doRelational(), and rdToken().

#define TOK_GT 15

Definition at line 136 of file expression.c.

Referenced by doRelational(), and rdToken().

#define TOK_IDENTIFIER 4

Definition at line 125 of file expression.c.

Referenced by doPrimary(), and rdToken().

#define TOK_INTEGER 2

Definition at line 123 of file expression.c.

Referenced by doPrimary(), and rdToken().

#define TOK_LE 14

Definition at line 135 of file expression.c.

Referenced by doRelational(), and rdToken().

#define TOK_LOGICAL_AND 18

Definition at line 139 of file expression.c.

Referenced by doLogical(), and rdToken().

#define TOK_LOGICAL_OR 19

Definition at line 140 of file expression.c.

Referenced by doLogical(), and rdToken().

#define TOK_LT 13

Definition at line 134 of file expression.c.

Referenced by doRelational(), and rdToken().

#define TOK_MINUS 6

Definition at line 127 of file expression.c.

Referenced by doAddSubtract(), doPrimary(), and rdToken().

#define TOK_MULTIPLY 7

Definition at line 128 of file expression.c.

Referenced by doMultiplyDivide(), and rdToken().

#define TOK_NEQ 12

Definition at line 133 of file expression.c.

Referenced by doRelational(), and rdToken().

#define TOK_NOT 17

Definition at line 138 of file expression.c.

Referenced by doPrimary(), and rdToken().

#define TOK_OPEN_P 9

Definition at line 130 of file expression.c.

Referenced by doPrimary(), and rdToken().

#define TOK_STRING 3

Definition at line 124 of file expression.c.

Referenced by doPrimary(), and rdToken().

#define valueIsInteger | ( |  | v | ) | ((v)->type == VALUE_TYPE_INTEGER)

Definition at line 98 of file expression.c.

Referenced by doAddSubtract(), doLogical(), doMultiplyDivide(), doPrimary(), and doRelational().

#define valueIsString | ( |  | v | ) | ((v)->type == VALUE_TYPE_STRING)

Definition at line 99 of file expression.c.

#define valueSameType | ( |  | v1,
|  |  | v2
| ) |  | ((v1)->type == (v2)->type)

Definition at line 100 of file expression.c.

Referenced by doAddSubtract(), doLogical(), doMultiplyDivide(), and doRelational().

## Typedef Documentation

typedef struct _parseState * ParseState

Parser state.

typedef struct _value * Value

Encapsulation of a "value".

## Function Documentation

static Value doAddSubtract | ( | ParseState | state | ) |

static

Parameters

  state | expression parser state

Definition at line 473 of file expression.c.

References _, _value::data, DEBUG, doMultiplyDivide(), _value::i, _parseState::nextToken, rdToken(), rpmlog(), RPMLOG_ERR, _value::s, stpcpy(), TOK_ADD, TOK_MINUS, valueFree(), valueIsInteger, valueMakeInteger(), valueMakeString(), valueSameType, and xmalloc().

Referenced by doRelational().

static Value doLogical | ( | ParseState | state | ) |

static

Parameters

  state | expression parser state

Definition at line 629 of file expression.c.

References _, _value::data, DEBUG, doRelational(), _value::i, _parseState::nextToken, rdToken(), rpmlog(), RPMLOG_ERR, TOK_LOGICAL_AND, TOK_LOGICAL_OR, valueFree(), valueIsInteger, valueMakeInteger(), and valueSameType.

Referenced by doPrimary(), parseExpressionBoolean(), and parseExpressionString().

static Value doMultiplyDivide | ( | ParseState | state | ) |

static

Parameters

  state | expression parser state

Definition at line 419 of file expression.c.

References _, _value::data, DEBUG, doPrimary(), _value::i, _parseState::nextToken, rdToken(), rpmlog(), RPMLOG_ERR, TOK_DIVIDE, TOK_MULTIPLY, valueFree(), valueIsInteger, valueMakeInteger(), and valueSameType.

Referenced by doAddSubtract().

static Value doPrimary | ( | ParseState | state | ) |

static

Parameters

  state | expression parser state

Definition at line 337 of file expression.c.

References _, _value::data, DEBUG, doLogical(), _value::i, _parseState::nextToken, rdToken(), rpmExpand(), rpmlog(), RPMLOG_ERR, _value::s, TOK_CLOSE_P, TOK_IDENTIFIER, TOK_INTEGER, TOK_MINUS, TOK_NOT, TOK_OPEN_P, TOK_STRING, _parseState::tokenValue, valueIsInteger, valueMakeInteger(), and valueMakeString().

Referenced by doMultiplyDivide().

static Value doRelational | ( | ParseState | state | ) |

static

Parameters

  state | expression parser state

Definition at line 535 of file expression.c.

References _, _value::data, DEBUG, doAddSubtract(), _value::i, _parseState::nextToken, rdToken(), rpmlog(), RPMLOG_ERR, _value::s, TOK_EQ, TOK_GE, TOK_GT, TOK_LE, TOK_LT, TOK_NEQ, valueFree(), valueIsInteger, valueMakeInteger(), and valueSameType.

Referenced by doLogical().

static int rdToken | ( | ParseState | state | ) |

static

Parameters

  state | expression parser state

Definition at line 190 of file expression.c.

References _, DEBUG, EXPRBUFSIZ, _parseState::nextToken, _parseState::p, rpmExpand(), rpmlog(), RPMLOG_ERR, TOK_ADD, TOK_CLOSE_P, TOK_DIVIDE, TOK_EOF, TOK_EQ, TOK_GE, TOK_GT, TOK_IDENTIFIER, TOK_INTEGER, TOK_LE, TOK_LOGICAL_AND, TOK_LOGICAL_OR, TOK_LT, TOK_MINUS, TOK_MULTIPLY, TOK_NEQ, TOK_NOT, TOK_OPEN_P, TOK_STRING, _parseState::tokenValue, valueMakeInteger(), valueMakeString(), xisalnum(), xisalpha(), xisdigit(), xisspace(), and xstrdup().

Referenced by doAddSubtract(), doLogical(), doMultiplyDivide(), doPrimary(), doRelational(), parseExpressionBoolean(), and parseExpressionString().

static void valueFree | ( | Value | v | ) |

static

Definition at line 72 of file expression.c.

References _free(), _value::data, _value::s, and _value::type.

Referenced by doAddSubtract(), doLogical(), doMultiplyDivide(), doRelational(), parseExpressionBoolean(), and parseExpressionString().

static Value valueMakeInteger | ( | int | i | ) |

static

Definition at line 46 of file expression.c.

References _value::data, _value::i, _value::type, and xmalloc().

Referenced by doAddSubtract(), doLogical(), doMultiplyDivide(), doPrimary(), doRelational(), and rdToken().

static Value valueMakeString | ( | const char * | s | ) |

static

Definition at line 59 of file expression.c.

References _value::data, _value::s, _value::type, and xmalloc().

Referenced by doAddSubtract(), doPrimary(), and rdToken().