aboutsummaryrefslogtreecommitdiff
path: root/contrib/bc/include/parse.h
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/bc/include/parse.h')
-rw-r--r--contrib/bc/include/parse.h87
1 files changed, 45 insertions, 42 deletions
diff --git a/contrib/bc/include/parse.h b/contrib/bc/include/parse.h
index 35ca1652fc98..7f0f8768b0db 100644
--- a/contrib/bc/include/parse.h
+++ b/contrib/bc/include/parse.h
@@ -3,7 +3,7 @@
*
* SPDX-License-Identifier: BSD-2-Clause
*
- * Copyright (c) 2018-2021 Gavin D. Howard and contributors.
+ * Copyright (c) 2018-2024 Gavin D. Howard and contributors.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
@@ -53,23 +53,24 @@
/// loops, while loops, and if statements. This is because POSIX requires that
/// certain operators are *only* used in those cases. It's whacked, but that's
/// how it is.
-#define BC_PARSE_REL (UINTMAX_C(1)<<0)
+#define BC_PARSE_REL (UINTMAX_C(1) << 0)
/// A flag that requires that the expression is valid for a print statement.
-#define BC_PARSE_PRINT (UINTMAX_C(1)<<1)
+#define BC_PARSE_PRINT (UINTMAX_C(1) << 1)
/// A flag that requires that the expression does *not* have any function call.
-#define BC_PARSE_NOCALL (UINTMAX_C(1)<<2)
+#define BC_PARSE_NOCALL (UINTMAX_C(1) << 2)
-/// A flag that requires that the expression does *not* have a read() expression.
-#define BC_PARSE_NOREAD (UINTMAX_C(1)<<3)
+/// A flag that requires that the expression does *not* have a read()
+/// expression.
+#define BC_PARSE_NOREAD (UINTMAX_C(1) << 3)
/// A flag that *allows* (rather than requires) that an array appear in the
/// expression. This is mostly used as parameters in bc.
-#define BC_PARSE_ARRAY (UINTMAX_C(1)<<4)
+#define BC_PARSE_ARRAY (UINTMAX_C(1) << 4)
/// A flag that requires that the expression is not empty and returns a value.
-#define BC_PARSE_NEEDVAL (UINTMAX_C(1)<<5)
+#define BC_PARSE_NEEDVAL (UINTMAX_C(1) << 5)
/**
* Returns true if the parser has been initialized.
@@ -79,18 +80,6 @@
*/
#define BC_PARSE_IS_INITED(p, prg) ((p)->prog == (prg))
-#if BC_ENABLED
-
-/**
- * Returns true if the current parser state allows parsing, false otherwise.
- * @param p The parser.
- * @return True if parsing can proceed, false otherwise.
- */
-#define BC_PARSE_CAN_PARSE(p) \
- ((p).l.t != BC_LEX_EOF && (p).l.t != BC_LEX_KW_DEFINE)
-
-#else // BC_ENABLED
-
/**
* Returns true if the current parser state allows parsing, false otherwise.
* @param p The parser.
@@ -98,8 +87,6 @@
*/
#define BC_PARSE_CAN_PARSE(p) ((p).l.t != BC_LEX_EOF)
-#endif // BC_ENABLED
-
/**
* Pushes the instruction @a i onto the bytecode vector for the current
* function.
@@ -118,22 +105,32 @@
#define bc_parse_pushIndex(p, idx) (bc_vec_pushIndex(&(p)->func->code, (idx)))
/**
- * A convenience macro for throwing errors in parse code. They take care of
+ * A convenience macro for throwing errors in parse code. This takes care of
* plumbing like passing in the current line the lexer is on.
* @param p The parser.
* @param e The error.
*/
+#if BC_DEBUG
+#define bc_parse_err(p, e) \
+ (bc_vm_handleError((e), __FILE__, __LINE__, (p)->l.line))
+#else // BC_DEBUG
#define bc_parse_err(p, e) (bc_vm_handleError((e), (p)->l.line))
+#endif // BC_DEBUG
/**
- * A convenience macro for throwing errors in parse code. They take care of
+ * A convenience macro for throwing errors in parse code. This takes care of
* plumbing like passing in the current line the lexer is on.
* @param p The parser.
* @param e The error.
* @param ... The varags that are needed.
*/
+#if BC_DEBUG
+#define bc_parse_verr(p, e, ...) \
+ (bc_vm_handleError((e), __FILE__, __LINE__, (p)->l.line, __VA_ARGS__))
+#else // BC_DEBUG
#define bc_parse_verr(p, e, ...) \
(bc_vm_handleError((e), (p)->l.line, __VA_ARGS__))
+#endif // BC_DEBUG
// Forward declarations.
struct BcParse;
@@ -154,8 +151,8 @@ typedef void (*BcParseParse)(struct BcParse* p);
typedef void (*BcParseExpr)(struct BcParse* p, uint8_t flags);
/// The parser struct.
-typedef struct BcParse {
-
+typedef struct BcParse
+{
/// The lexer.
BcLex l;
@@ -191,11 +188,11 @@ typedef struct BcParse {
#endif // BC_ENABLED
/// A reference to the program to grab the current function when necessary.
- struct BcProgram *prog;
+ struct BcProgram* prog;
/// A reference to the current function. The function is what holds the
/// bytecode vector that the parser is filling.
- BcFunc *func;
+ BcFunc* func;
/// The index of the function.
size_t fidx;
@@ -214,40 +211,46 @@ typedef struct BcParse {
* @param prog A referenc to the program.
* @param func The index of the current function.
*/
-void bc_parse_init(BcParse *p, struct BcProgram *prog, size_t func);
+void
+bc_parse_init(BcParse* p, struct BcProgram* prog, size_t func);
/**
- * Frees a parser. This is not guarded by #ifndef NDEBUG because a separate
+ * Frees a parser. This is not guarded by #if BC_DEBUG because a separate
* parser is created at runtime to parse read() expressions and dc strings.
* @param p The parser to free.
*/
-void bc_parse_free(BcParse *p);
+void
+bc_parse_free(BcParse* p);
/**
* Resets the parser. Resetting means erasing all state to the point that the
* parser would think it was just initialized.
* @param p The parser to reset.
*/
-void bc_parse_reset(BcParse *p);
+void
+bc_parse_reset(BcParse* p);
/**
* Adds a string. See @a BcProgram in include/program.h for more details.
* @param p The parser that parsed the string.
*/
-void bc_parse_addString(BcParse *p);
+void
+bc_parse_addString(BcParse* p);
/**
* Adds a number. See @a BcProgram in include/program.h for more details.
* @param p The parser that parsed the number.
*/
-void bc_parse_number(BcParse *p);
+void
+bc_parse_number(BcParse* p);
/**
* Update the current function in the parser.
* @param p The parser.
* @param fidx The index of the new function.
*/
-void bc_parse_updateFunc(BcParse *p, size_t fidx);
+void
+bc_parse_updateFunc(BcParse* p, size_t fidx);
/**
* Adds a new variable or array. See @a BcProgram in include/program.h for more
@@ -256,17 +259,17 @@ void bc_parse_updateFunc(BcParse *p, size_t fidx);
* @param name The name of the variable or array to add.
* @param var True if the name is for a variable, false if it's for an array.
*/
-void bc_parse_pushName(const BcParse* p, char *name, bool var);
+void
+bc_parse_pushName(const BcParse* p, char* name, bool var);
/**
* Sets the text that the parser will parse.
- * @param p The parser.
- * @param text The text to lex.
- * @param is_stdin True if the text is from stdin, false otherwise.
- * @param is_exprs True if the text is from command-line expressions, false
- * otherwise.
+ * @param p The parser.
+ * @param text The text to lex.
+ * @param mode The mode to parse in.
*/
-void bc_parse_text(BcParse *p, const char *text, bool is_stdin, bool is_exprs);
+void
+bc_parse_text(BcParse* p, const char* text, BcMode mode);
// References to const 0 and 1 strings for special cases. bc and dc have
// specific instructions for 0 and 1 because they pop up so often and (in the