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