Team Ai
Datasetpublic

codekingpro/portable-devtools

sourceHugging Faceupdated 5mo agoView on Hugging Face
1likes16kdownloads
conditional.h103 linesDownload Raw Back to fe_utils
1/*-------------------------------------------------------------------------2 * A stack of automaton states to handle nested conditionals.3 *4 * This file describes a stack of automaton states which5 * allow a manage nested conditionals.6 *7 * It is used by:8 * - "psql" interpreter for handling \if ... \endif9 * - "pgbench" interpreter for handling \if ... \endif10 * - "pgbench" syntax checker to test for proper nesting11 *12 * The stack holds the state of enclosing conditionals (are we in13 * a true branch? in a false branch? have we already encountered14 * a true branch?) so that the interpreter knows whether to execute15 * code and whether to evaluate conditions.16 *17 * Copyright (c) 2000-2023, PostgreSQL Global Development Group18 *19 * src/include/fe_utils/conditional.h20 *21 *-------------------------------------------------------------------------22 */23#ifndef CONDITIONAL_H24#define CONDITIONAL_H25 26/*27 * Possible states of a single level of \if block.28 */29typedef enum ifState30{31	IFSTATE_NONE = 0,			/* not currently in an \if block */32	IFSTATE_TRUE,				/* currently in an \if or \elif that is true33								 * and all parent branches (if any) are true */34	IFSTATE_FALSE,				/* currently in an \if or \elif that is false35								 * but no true branch has yet been seen, and36								 * all parent branches (if any) are true */37	IFSTATE_IGNORED,			/* currently in an \elif that follows a true38								 * branch, or the whole \if is a child of a39								 * false parent branch */40	IFSTATE_ELSE_TRUE,			/* currently in an \else that is true and all41								 * parent branches (if any) are true */42	IFSTATE_ELSE_FALSE			/* currently in an \else that is false or43								 * ignored */44} ifState;45 46/*47 * The state of nested \ifs is stored in a stack.48 *49 * query_len is used to determine what accumulated text to throw away at the50 * end of an inactive branch.  (We could, perhaps, teach the lexer to not add51 * stuff to the query buffer in the first place when inside an inactive branch;52 * but that would be very invasive.)  We also need to save and restore the53 * lexer's parenthesis nesting depth when throwing away text.  (We don't need54 * to save and restore any of its other state, such as comment nesting depth,55 * because a backslash command could never appear inside a comment or SQL56 * literal.)57 */58typedef struct IfStackElem59{60	ifState		if_state;		/* current state, see enum above */61	int			query_len;		/* length of query_buf at last branch start */62	int			paren_depth;	/* parenthesis depth at last branch start */63	struct IfStackElem *next;	/* next surrounding \if, if any */64} IfStackElem;65 66typedef struct ConditionalStackData67{68	IfStackElem *head;69}			ConditionalStackData;70 71typedef struct ConditionalStackData *ConditionalStack;72 73 74extern ConditionalStack conditional_stack_create(void);75 76extern void conditional_stack_reset(ConditionalStack cstack);77 78extern void conditional_stack_destroy(ConditionalStack cstack);79 80extern int	conditional_stack_depth(ConditionalStack cstack);81 82extern void conditional_stack_push(ConditionalStack cstack, ifState new_state);83 84extern bool conditional_stack_pop(ConditionalStack cstack);85 86extern ifState conditional_stack_peek(ConditionalStack cstack);87 88extern bool conditional_stack_poke(ConditionalStack cstack, ifState new_state);89 90extern bool conditional_stack_empty(ConditionalStack cstack);91 92extern bool conditional_active(ConditionalStack cstack);93 94extern void conditional_stack_set_query_len(ConditionalStack cstack, int len);95 96extern int	conditional_stack_get_query_len(ConditionalStack cstack);97 98extern void conditional_stack_set_paren_depth(ConditionalStack cstack, int depth);99 100extern int	conditional_stack_get_paren_depth(ConditionalStack cstack);101 102#endif							/* CONDITIONAL_H */103 
codekingpro/portable-devtools · Team Ai