#ifndef STRINGS_H #define STRINGS_H #include #include #include "pegen.h" #define EXPRLIST_N_CACHED 64 typedef struct { /* Incrementally build an array of expr_ty, so be used in an asdl_seq. Cache some small but reasonably sized number of expr_ty's, and then after that start dynamically allocating, doubling the number allocated each time. Note that the f-string f'{0}a{1}' contains 3 expr_ty's: 2 FormattedValue's, and one Constant for the literal 'a'. So you add expr_ty's about twice as fast as you add expressions in an f-string. */ Py_ssize_t allocated; /* Number we've allocated. */ Py_ssize_t size; /* Number we've used. */ expr_ty *p; /* Pointer to the memory we're actually using. Will point to 'data' until we start dynamically allocating. */ expr_ty data[EXPRLIST_N_CACHED]; } ExprList; /* The FstringParser is designed to add a mix of strings and f-strings, and concat them together as needed. Ultimately, it generates an expr_ty. */ typedef struct { PyObject *last_str; ExprList expr_list; int fmode; } FstringParser; void _PyPegen_FstringParser_Init(FstringParser *); int _PyPegen_parsestr(Parser *, const char *, int *, int *, PyObject **, const char **, Py_ssize_t *); int _PyPegen_FstringParser_ConcatFstring(Parser *, FstringParser *, const char **, const char *, int, int, Token *, Token *, Token *); int _PyPegen_FstringParser_ConcatAndDel(FstringParser *, PyObject *); expr_ty _PyPegen_FstringParser_Finish(Parser *, FstringParser *, Token *, Token *); void _PyPegen_FstringParser_Dealloc(FstringParser *); #endif