Changeset 3456 for trunk/src/kash/memalloc.h
- Timestamp:
- Sep 14, 2020, 2:03:45 PM (5 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/kash/memalloc.h
r3437 r3456 51 51 pointer ckrealloc(struct shinstance *, pointer, size_t); 52 52 char *savestr(struct shinstance *, const char *); 53 #define ckfree(psh, p) sh_free(psh, (pointer)(p)) 54 55 #ifndef SH_MEMALLOC_NO_STACK 53 56 pointer stalloc(struct shinstance *, size_t); 54 57 char *stsavestr(struct shinstance *, const char *); … … 60 63 char *growstackstr(struct shinstance *); 61 64 char *makestrspace(struct shinstance *); 65 char *grabstackstr(struct shinstance *, char *); /* was #define using stalloc */ 62 66 void ungrabstackstr(struct shinstance *, char *, char *); 63 64 65 67 66 68 #define stackblock(psh) (psh)->stacknxt … … 69 71 #define STPUTC(psh, c, p) (--(psh)->sstrnleft >= 0? (*p++ = (c)) : (p = growstackstr(psh), *p++ = (c))) 70 72 #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) 72 76 #define STACKSTRNUL(psh, p) ((psh)->sstrnleft == 0? (p = growstackstr(psh), *p = '\0') : (*p = '\0')) 73 77 #define STUNPUTC(psh, p) (++(psh)->sstrnleft, --p) 74 #define STTOPC(psh, p) p[-1]75 78 #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 */ 77 80 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 * @{ */ 86 void *pstalloc(struct shinstance *, size_t); 87 union node; 88 union node *pstallocnode(struct shinstance *, size_t); 89 struct nodelist; 90 struct nodelist *pstalloclist(struct shinstance *); 91 char *pstsavestr(struct shinstance *, const char *); /* was: stsavestr */ 92 #define PSTARTSTACKSTR(psh, p) do { (p) = (psh)->stacknxt; (psh)->sstrnleft = (psh)->stacknleft; } while (0) 93 char *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) 97 char *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) 102 char *pstgrabstr(struct shinstance *, char *); /* was: grabstackstr / grabstackblock*/ 103 /** @} */ 104 105
Note:
See TracChangeset
for help on using the changeset viewer.