17db96d56Sopenharmony_ci#ifndef STRINGS_H 27db96d56Sopenharmony_ci#define STRINGS_H 37db96d56Sopenharmony_ci 47db96d56Sopenharmony_ci#include <Python.h> 57db96d56Sopenharmony_ci#include <pycore_ast.h> 67db96d56Sopenharmony_ci#include "pegen.h" 77db96d56Sopenharmony_ci 87db96d56Sopenharmony_ci#define EXPRLIST_N_CACHED 64 97db96d56Sopenharmony_ci 107db96d56Sopenharmony_citypedef struct { 117db96d56Sopenharmony_ci /* Incrementally build an array of expr_ty, so be used in an 127db96d56Sopenharmony_ci asdl_seq. Cache some small but reasonably sized number of 137db96d56Sopenharmony_ci expr_ty's, and then after that start dynamically allocating, 147db96d56Sopenharmony_ci doubling the number allocated each time. Note that the f-string 157db96d56Sopenharmony_ci f'{0}a{1}' contains 3 expr_ty's: 2 FormattedValue's, and one 167db96d56Sopenharmony_ci Constant for the literal 'a'. So you add expr_ty's about twice as 177db96d56Sopenharmony_ci fast as you add expressions in an f-string. */ 187db96d56Sopenharmony_ci 197db96d56Sopenharmony_ci Py_ssize_t allocated; /* Number we've allocated. */ 207db96d56Sopenharmony_ci Py_ssize_t size; /* Number we've used. */ 217db96d56Sopenharmony_ci expr_ty *p; /* Pointer to the memory we're actually 227db96d56Sopenharmony_ci using. Will point to 'data' until we 237db96d56Sopenharmony_ci start dynamically allocating. */ 247db96d56Sopenharmony_ci expr_ty data[EXPRLIST_N_CACHED]; 257db96d56Sopenharmony_ci} ExprList; 267db96d56Sopenharmony_ci 277db96d56Sopenharmony_ci/* The FstringParser is designed to add a mix of strings and 287db96d56Sopenharmony_ci f-strings, and concat them together as needed. Ultimately, it 297db96d56Sopenharmony_ci generates an expr_ty. */ 307db96d56Sopenharmony_citypedef struct { 317db96d56Sopenharmony_ci PyObject *last_str; 327db96d56Sopenharmony_ci ExprList expr_list; 337db96d56Sopenharmony_ci int fmode; 347db96d56Sopenharmony_ci} FstringParser; 357db96d56Sopenharmony_ci 367db96d56Sopenharmony_civoid _PyPegen_FstringParser_Init(FstringParser *); 377db96d56Sopenharmony_ciint _PyPegen_parsestr(Parser *, int *, int *, PyObject **, 387db96d56Sopenharmony_ci const char **, Py_ssize_t *, Token *); 397db96d56Sopenharmony_ciint _PyPegen_FstringParser_ConcatFstring(Parser *, FstringParser *, const char **, 407db96d56Sopenharmony_ci const char *, int, int, Token *, Token *, 417db96d56Sopenharmony_ci Token *); 427db96d56Sopenharmony_ciint _PyPegen_FstringParser_ConcatAndDel(FstringParser *, PyObject *); 437db96d56Sopenharmony_ciexpr_ty _PyPegen_FstringParser_Finish(Parser *, FstringParser *, Token *, Token *); 447db96d56Sopenharmony_civoid _PyPegen_FstringParser_Dealloc(FstringParser *); 457db96d56Sopenharmony_ci 467db96d56Sopenharmony_ci#endif 47