* details.
*
* You should have received a copy of the GNU Lesser General Public
- * License along with these librararies and programs; if not, write
+ * License along with these libraries and programs; if not, write
* to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
* Floor, Boston, MA 02110-1301 USA
*/
#include "ifparser.h"
#include <ctype.h>
+#include <stdlib.h>
#include <string.h>
#include <limits.h>
const char *cp;
long *valp;
{
- const char *var;
+ const char *var, *varend;
*valp = 0;
*valp = -(*valp);
return cp;
+ case '+':
+ DO (cp = parse_value (g, cp + 1, valp));
+ *valp = +(*valp);
+ return cp;
+
+ case '~':
+ DO (cp = parse_value (g, cp + 1, valp));
+ *valp = ~(*valp);
+ return cp;
+
case '#':
DO (cp = parse_variable (g, cp + 1, &var));
SKIPSPACE (cp);
return CALLFUNC(g, handle_error) (g, cp, "variable or number");
else {
DO (cp = parse_variable (g, cp, &var));
- *valp = (*(g->funcs.eval_variable)) (g, var, cp - var);
+ varend = cp;
+ SKIPSPACE(cp);
+ if (*cp != '(') {
+ *valp = (*(g->funcs.eval_variable)) (g, var, varend - var);
+ } else {
+ do {
+ long dummy;
+ DO (cp = ParseIfExpression (g, cp + 1, &dummy));
+ SKIPSPACE(cp);
+ if (*cp == ')')
+ break;
+ if (*cp != ',')
+ return CALLFUNC(g, handle_error) (g, cp, ",");
+ } while (1);
+
+ *valp = 1; /* XXX */
+ cp++;
+ }
}
return cp;
static const char *
-parse_bor (g, cp, valp)
+parse_bxor (g, cp, valp)
IfParser *g;
const char *cp;
long *valp;
DO (cp = parse_band (g, cp, valp));
SKIPSPACE (cp);
+ switch (*cp) {
+ case '^':
+ DO (cp = parse_bxor (g, cp + 1, &rightval));
+ *valp = (*valp ^ rightval);
+ break;
+ }
+ return cp;
+}
+
+
+static const char *
+parse_bor (g, cp, valp)
+ IfParser *g;
+ const char *cp;
+ long *valp;
+{
+ long rightval;
+
+ DO (cp = parse_bxor (g, cp, valp));
+ SKIPSPACE (cp);
+
switch (*cp) {
case '|':
if (cp[1] != '|') {