Ignore:
Timestamp:
Sep 14, 2020, 2:03:45 PM (5 years ago)
Author:
bird
Message:

kash: parser.c,memalloc.c/.h,expand.c: Prepared the parser for using a separate allocator.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/kash/memalloc.h

    r3437 r3456  
    5151pointer ckrealloc(struct shinstance *, pointer, size_t);
    5252char *savestr(struct shinstance *, const char *);
     53#define ckfree(psh, p)  sh_free(psh, (pointer)(p))
     54
     55#ifndef SH_MEMALLOC_NO_STACK
    5356pointer stalloc(struct shinstance *, size_t);
    5457char *stsavestr(struct shinstance *, const char *);
     
    6063char *growstackstr(struct shinstance *);
    6164char *makestrspace(struct shinstance *);
     65char *grabstackstr(struct shinstance *, char *); /* was #define using stalloc */
    6266void ungrabstackstr(struct shinstance *, char *, char *);
    63 
    64 
    6567
    6668#define stackblock(psh)             (psh)->stacknxt
     
    6971#define STPUTC(psh, c, p)           (--(psh)->sstrnleft >= 0? (*p++ = (c)) : (p = growstackstr(psh), *p++ = (c)))
    7072#define CHECKSTRSPACE(psh, n, p)    { if ((psh)->sstrnleft < n) p = makestrspace(psh); }
    71 #define USTPUTC(psh, c, p)          (--(psh)->sstrnleft, *p++ = (c))
     73#define USTPUTC(psh, c, p)          do { assert((psh)->sstrnleft > 0); \
     74                                         assert(p - (char *)stackblock(psh) == stackblocksize(psh) - (psh)->sstrnleft); \
     75                                         --(psh)->sstrnleft; *p++ = (c); } while (0)
    7276#define STACKSTRNUL(psh, p)         ((psh)->sstrnleft == 0? (p = growstackstr(psh), *p = '\0') : (*p = '\0'))
    7377#define STUNPUTC(psh, p)            (++(psh)->sstrnleft, --p)
    74 #define STTOPC(psh, p)              p[-1]
    7578#define STADJUST(psh, amount, p)    (p += (amount), (psh)->sstrnleft -= (amount))
    76 #define grabstackstr(psh, p)        stalloc((psh), stackblocksize(psh) - (psh)->sstrnleft)
     79#endif /* SH_MEMALLOC_NO_STACK */
    7780
    78 #define ckfree(psh, p)              sh_free(psh, (pointer)(p))
     81/** @name Stack allocator for parser.
     82 * This is a stripped down version of the general stack allocator interface for
     83 * the exclusive use of the parser, so that parsetrees can be shared with
     84 * subshells by simple reference counting.
     85 * @{ */
     86void *pstalloc(struct shinstance *, size_t);
     87union node;
     88union node *pstallocnode(struct shinstance *, size_t);
     89struct nodelist;
     90struct nodelist *pstalloclist(struct shinstance *);
     91char *pstsavestr(struct shinstance *, const char *); /* was: stsavestr */
     92#define PSTARTSTACKSTR(psh, p)      do { (p) = (psh)->stacknxt; (psh)->sstrnleft = (psh)->stacknleft; } while (0)
     93char *pstmakestrspace(struct shinstance *, size_t, char *); /* was: makestrspace / growstackstr */
     94#define PSTCHECKSTRSPACE(psh, n, p) do { if ((psh)->sstrnleft >= (n)) {/*likely*/} \
     95                                         else { (p) = pstmakestrspace(psh, (n), (p)); assert((psh)->sstrnleft >= (n)); } } while (0)
     96#define PSTUPUTC(psh, c, p)         do { assert((psh)->sstrnleft > 0); --(psh)->sstrnleft; *(p)++ = (c); } while (0)
     97char *pstputcgrow(struct shinstance *, char *, char);
     98#define PSTPUTC(psh, c, p)          do { if (--(psh)->sstrnleft >= 0) *(p)++ = (c); else (p) = pstputcgrow(psh, (p), (c)); } while (0)
     99#define PSTPUTSTRN(psh, str, n, p)  do { if ((psh)->sstrnleft >= (n)) {/*likely?*/} else (p) = pstmakestrspace(psh, (n), (p)); \
     100                                         memcpy((p), (str), (n)); (psh)->sstrnleft -= (n); (p) += (n); } while (0)
     101#define PSTBLOCK(psh)               ((psh)->stacknxt)
     102char *pstgrabstr(struct shinstance *, char *); /* was: grabstackstr / grabstackblock*/
     103/** @} */
     104
     105
Note: See TracChangeset for help on using the changeset viewer.