diff options
author | Nguyễn Thái Ngọc Duy <pclouds@gmail.com> | 2010-04-14 00:31:43 +0200 |
---|---|---|
committer | Nguyễn Thái Ngọc Duy <pclouds@gmail.com> | 2010-04-20 19:14:43 +0200 |
commit | f7ac25c247dd4274b10c672003ed424695c375cb (patch) | |
tree | a4dad307e47e43b3b474bbe6c9862c81b30ee4e9 /shell | |
parent | 64ab89438d39b9ffa30f6b5fb1867b0fb11f28f1 (diff) | |
download | busybox-w32-f7ac25c247dd4274b10c672003ed424695c375cb.tar.gz busybox-w32-f7ac25c247dd4274b10c672003ed424695c375cb.tar.bz2 busybox-w32-f7ac25c247dd4274b10c672003ed424695c375cb.zip |
win32: Support saving pointer location in calcsize()/copynode()
Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
Diffstat (limited to 'shell')
-rw-r--r-- | shell/ash.c | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/shell/ash.c b/shell/ash.c index 137d8edde..1326182fe 100644 --- a/shell/ash.c +++ b/shell/ash.c | |||
@@ -8012,6 +8012,10 @@ static int funcblocksize; /* size of structures in function */ | |||
8012 | static int funcstringsize; /* size of strings in node */ | 8012 | static int funcstringsize; /* size of strings in node */ |
8013 | static void *funcblock; /* block to allocate function from */ | 8013 | static void *funcblock; /* block to allocate function from */ |
8014 | static char *funcstring; /* block to allocate strings from */ | 8014 | static char *funcstring; /* block to allocate strings from */ |
8015 | #if ENABLE_PLATFORM_MINGW32 | ||
8016 | static int nodeptrsize; | ||
8017 | static int *nodeptr; | ||
8018 | #endif | ||
8015 | 8019 | ||
8016 | /* flags in argument to evaltree */ | 8020 | /* flags in argument to evaltree */ |
8017 | #define EV_EXIT 01 /* exit after evaluating tree */ | 8021 | #define EV_EXIT 01 /* exit after evaluating tree */ |
@@ -8057,6 +8061,7 @@ sizenodelist(struct nodelist *lp) | |||
8057 | { | 8061 | { |
8058 | while (lp) { | 8062 | while (lp) { |
8059 | funcblocksize += SHELL_ALIGN(sizeof(struct nodelist)); | 8063 | funcblocksize += SHELL_ALIGN(sizeof(struct nodelist)); |
8064 | IF_PLATFORM_MINGW32(nodeptrsize += 2); | ||
8060 | calcsize(lp->n); | 8065 | calcsize(lp->n); |
8061 | lp = lp->next; | 8066 | lp = lp->next; |
8062 | } | 8067 | } |
@@ -8073,15 +8078,18 @@ calcsize(union node *n) | |||
8073 | calcsize(n->ncmd.redirect); | 8078 | calcsize(n->ncmd.redirect); |
8074 | calcsize(n->ncmd.args); | 8079 | calcsize(n->ncmd.args); |
8075 | calcsize(n->ncmd.assign); | 8080 | calcsize(n->ncmd.assign); |
8081 | IF_PLATFORM_MINGW32(nodeptrsize += 3); | ||
8076 | break; | 8082 | break; |
8077 | case NPIPE: | 8083 | case NPIPE: |
8078 | sizenodelist(n->npipe.cmdlist); | 8084 | sizenodelist(n->npipe.cmdlist); |
8085 | IF_PLATFORM_MINGW32(nodeptrsize++); | ||
8079 | break; | 8086 | break; |
8080 | case NREDIR: | 8087 | case NREDIR: |
8081 | case NBACKGND: | 8088 | case NBACKGND: |
8082 | case NSUBSHELL: | 8089 | case NSUBSHELL: |
8083 | calcsize(n->nredir.redirect); | 8090 | calcsize(n->nredir.redirect); |
8084 | calcsize(n->nredir.n); | 8091 | calcsize(n->nredir.n); |
8092 | IF_PLATFORM_MINGW32(nodeptrsize += 2); | ||
8085 | break; | 8093 | break; |
8086 | case NAND: | 8094 | case NAND: |
8087 | case NOR: | 8095 | case NOR: |
@@ -8090,31 +8098,37 @@ calcsize(union node *n) | |||
8090 | case NUNTIL: | 8098 | case NUNTIL: |
8091 | calcsize(n->nbinary.ch2); | 8099 | calcsize(n->nbinary.ch2); |
8092 | calcsize(n->nbinary.ch1); | 8100 | calcsize(n->nbinary.ch1); |
8101 | IF_PLATFORM_MINGW32(nodeptrsize += 2); | ||
8093 | break; | 8102 | break; |
8094 | case NIF: | 8103 | case NIF: |
8095 | calcsize(n->nif.elsepart); | 8104 | calcsize(n->nif.elsepart); |
8096 | calcsize(n->nif.ifpart); | 8105 | calcsize(n->nif.ifpart); |
8097 | calcsize(n->nif.test); | 8106 | calcsize(n->nif.test); |
8107 | IF_PLATFORM_MINGW32(nodeptrsize += 3); | ||
8098 | break; | 8108 | break; |
8099 | case NFOR: | 8109 | case NFOR: |
8100 | funcstringsize += strlen(n->nfor.var) + 1; | 8110 | funcstringsize += strlen(n->nfor.var) + 1; |
8101 | calcsize(n->nfor.body); | 8111 | calcsize(n->nfor.body); |
8102 | calcsize(n->nfor.args); | 8112 | calcsize(n->nfor.args); |
8113 | IF_PLATFORM_MINGW32(nodeptrsize += 3); | ||
8103 | break; | 8114 | break; |
8104 | case NCASE: | 8115 | case NCASE: |
8105 | calcsize(n->ncase.cases); | 8116 | calcsize(n->ncase.cases); |
8106 | calcsize(n->ncase.expr); | 8117 | calcsize(n->ncase.expr); |
8118 | IF_PLATFORM_MINGW32(nodeptrsize += 2); | ||
8107 | break; | 8119 | break; |
8108 | case NCLIST: | 8120 | case NCLIST: |
8109 | calcsize(n->nclist.body); | 8121 | calcsize(n->nclist.body); |
8110 | calcsize(n->nclist.pattern); | 8122 | calcsize(n->nclist.pattern); |
8111 | calcsize(n->nclist.next); | 8123 | calcsize(n->nclist.next); |
8124 | IF_PLATFORM_MINGW32(nodeptrsize += 3); | ||
8112 | break; | 8125 | break; |
8113 | case NDEFUN: | 8126 | case NDEFUN: |
8114 | case NARG: | 8127 | case NARG: |
8115 | sizenodelist(n->narg.backquote); | 8128 | sizenodelist(n->narg.backquote); |
8116 | funcstringsize += strlen(n->narg.text) + 1; | 8129 | funcstringsize += strlen(n->narg.text) + 1; |
8117 | calcsize(n->narg.next); | 8130 | calcsize(n->narg.next); |
8131 | IF_PLATFORM_MINGW32(nodeptrsize += 3); | ||
8118 | break; | 8132 | break; |
8119 | case NTO: | 8133 | case NTO: |
8120 | #if ENABLE_ASH_BASH_COMPAT | 8134 | #if ENABLE_ASH_BASH_COMPAT |
@@ -8126,19 +8140,23 @@ calcsize(union node *n) | |||
8126 | case NAPPEND: | 8140 | case NAPPEND: |
8127 | calcsize(n->nfile.fname); | 8141 | calcsize(n->nfile.fname); |
8128 | calcsize(n->nfile.next); | 8142 | calcsize(n->nfile.next); |
8143 | IF_PLATFORM_MINGW32(nodeptrsize += 2); | ||
8129 | break; | 8144 | break; |
8130 | case NTOFD: | 8145 | case NTOFD: |
8131 | case NFROMFD: | 8146 | case NFROMFD: |
8132 | calcsize(n->ndup.vname); | 8147 | calcsize(n->ndup.vname); |
8133 | calcsize(n->ndup.next); | 8148 | calcsize(n->ndup.next); |
8149 | IF_PLATFORM_MINGW32(nodeptrsize += 2); | ||
8134 | break; | 8150 | break; |
8135 | case NHERE: | 8151 | case NHERE: |
8136 | case NXHERE: | 8152 | case NXHERE: |
8137 | calcsize(n->nhere.doc); | 8153 | calcsize(n->nhere.doc); |
8138 | calcsize(n->nhere.next); | 8154 | calcsize(n->nhere.next); |
8155 | IF_PLATFORM_MINGW32(nodeptrsize += 2); | ||
8139 | break; | 8156 | break; |
8140 | case NNOT: | 8157 | case NNOT: |
8141 | calcsize(n->nnot.com); | 8158 | calcsize(n->nnot.com); |
8159 | IF_PLATFORM_MINGW32(nodeptrsize++); | ||
8142 | break; | 8160 | break; |
8143 | }; | 8161 | }; |
8144 | } | 8162 | } |
@@ -8157,6 +8175,18 @@ nodeckstrdup(const char *s) | |||
8157 | 8175 | ||
8158 | static union node *copynode(union node *); | 8176 | static union node *copynode(union node *); |
8159 | 8177 | ||
8178 | #if ENABLE_PLATFORM_MINGW32 | ||
8179 | # define SAVE_PTR(dst) {if (nodeptr) *nodeptr++ = (int)&(dst);} | ||
8180 | # define SAVE_PTR2(dst1,dst2) {if (nodeptr) { *nodeptr++ = (int)&(dst1);*nodeptr++ = (int)&(dst2);}} | ||
8181 | # define SAVE_PTR3(dst1,dst2,dst3) {if (nodeptr) { *nodeptr++ = (int)&(dst1);*nodeptr++ = (int)&(dst2);*nodeptr++ = (int)&(dst3);}} | ||
8182 | # define SAVE_PTR4(dst1,dst2,dst3,dst4) {if (nodeptr) { *nodeptr++ = (int)&(dst1);*nodeptr++ = (int)&(dst2);*nodeptr++ = (int)&(dst3);*nodeptr++ = (int)&(dst4);}} | ||
8183 | #else | ||
8184 | # define SAVE_PTR(dst) | ||
8185 | # define SAVE_PTR2(dst,dst2) | ||
8186 | # define SAVE_PTR3(dst,dst2,dst3) | ||
8187 | # define SAVE_PTR4(dst,dst2,dst3,dst4) | ||
8188 | #endif | ||
8189 | |||
8160 | static struct nodelist * | 8190 | static struct nodelist * |
8161 | copynodelist(struct nodelist *lp) | 8191 | copynodelist(struct nodelist *lp) |
8162 | { | 8192 | { |
@@ -8168,6 +8198,7 @@ copynodelist(struct nodelist *lp) | |||
8168 | *lpp = funcblock; | 8198 | *lpp = funcblock; |
8169 | funcblock = (char *) funcblock + SHELL_ALIGN(sizeof(struct nodelist)); | 8199 | funcblock = (char *) funcblock + SHELL_ALIGN(sizeof(struct nodelist)); |
8170 | (*lpp)->n = copynode(lp->n); | 8200 | (*lpp)->n = copynode(lp->n); |
8201 | SAVE_PTR2((*lpp)->n, (*lpp)->next); | ||
8171 | lp = lp->next; | 8202 | lp = lp->next; |
8172 | lpp = &(*lpp)->next; | 8203 | lpp = &(*lpp)->next; |
8173 | } | 8204 | } |
@@ -8190,16 +8221,19 @@ copynode(union node *n) | |||
8190 | new->ncmd.redirect = copynode(n->ncmd.redirect); | 8221 | new->ncmd.redirect = copynode(n->ncmd.redirect); |
8191 | new->ncmd.args = copynode(n->ncmd.args); | 8222 | new->ncmd.args = copynode(n->ncmd.args); |
8192 | new->ncmd.assign = copynode(n->ncmd.assign); | 8223 | new->ncmd.assign = copynode(n->ncmd.assign); |
8224 | SAVE_PTR3(new->ncmd.redirect,new->ncmd.args, new->ncmd.assign); | ||
8193 | break; | 8225 | break; |
8194 | case NPIPE: | 8226 | case NPIPE: |
8195 | new->npipe.cmdlist = copynodelist(n->npipe.cmdlist); | 8227 | new->npipe.cmdlist = copynodelist(n->npipe.cmdlist); |
8196 | new->npipe.pipe_backgnd = n->npipe.pipe_backgnd; | 8228 | new->npipe.pipe_backgnd = n->npipe.pipe_backgnd; |
8229 | SAVE_PTR(new->npipe.cmdlist); | ||
8197 | break; | 8230 | break; |
8198 | case NREDIR: | 8231 | case NREDIR: |
8199 | case NBACKGND: | 8232 | case NBACKGND: |
8200 | case NSUBSHELL: | 8233 | case NSUBSHELL: |
8201 | new->nredir.redirect = copynode(n->nredir.redirect); | 8234 | new->nredir.redirect = copynode(n->nredir.redirect); |
8202 | new->nredir.n = copynode(n->nredir.n); | 8235 | new->nredir.n = copynode(n->nredir.n); |
8236 | SAVE_PTR2(new->nredir.redirect,new->nredir.n); | ||
8203 | break; | 8237 | break; |
8204 | case NAND: | 8238 | case NAND: |
8205 | case NOR: | 8239 | case NOR: |
@@ -8208,31 +8242,37 @@ copynode(union node *n) | |||
8208 | case NUNTIL: | 8242 | case NUNTIL: |
8209 | new->nbinary.ch2 = copynode(n->nbinary.ch2); | 8243 | new->nbinary.ch2 = copynode(n->nbinary.ch2); |
8210 | new->nbinary.ch1 = copynode(n->nbinary.ch1); | 8244 | new->nbinary.ch1 = copynode(n->nbinary.ch1); |
8245 | SAVE_PTR2(new->nbinary.ch1,new->nbinary.ch2); | ||
8211 | break; | 8246 | break; |
8212 | case NIF: | 8247 | case NIF: |
8213 | new->nif.elsepart = copynode(n->nif.elsepart); | 8248 | new->nif.elsepart = copynode(n->nif.elsepart); |
8214 | new->nif.ifpart = copynode(n->nif.ifpart); | 8249 | new->nif.ifpart = copynode(n->nif.ifpart); |
8215 | new->nif.test = copynode(n->nif.test); | 8250 | new->nif.test = copynode(n->nif.test); |
8251 | SAVE_PTR3(new->nif.elsepart,new->nif.ifpart,new->nif.test); | ||
8216 | break; | 8252 | break; |
8217 | case NFOR: | 8253 | case NFOR: |
8218 | new->nfor.var = nodeckstrdup(n->nfor.var); | 8254 | new->nfor.var = nodeckstrdup(n->nfor.var); |
8219 | new->nfor.body = copynode(n->nfor.body); | 8255 | new->nfor.body = copynode(n->nfor.body); |
8220 | new->nfor.args = copynode(n->nfor.args); | 8256 | new->nfor.args = copynode(n->nfor.args); |
8257 | SAVE_PTR3(new->nfor.var,new->nfor.body,new->nfor.args); | ||
8221 | break; | 8258 | break; |
8222 | case NCASE: | 8259 | case NCASE: |
8223 | new->ncase.cases = copynode(n->ncase.cases); | 8260 | new->ncase.cases = copynode(n->ncase.cases); |
8224 | new->ncase.expr = copynode(n->ncase.expr); | 8261 | new->ncase.expr = copynode(n->ncase.expr); |
8262 | SAVE_PTR2(new->ncase.cases,new->ncase.expr); | ||
8225 | break; | 8263 | break; |
8226 | case NCLIST: | 8264 | case NCLIST: |
8227 | new->nclist.body = copynode(n->nclist.body); | 8265 | new->nclist.body = copynode(n->nclist.body); |
8228 | new->nclist.pattern = copynode(n->nclist.pattern); | 8266 | new->nclist.pattern = copynode(n->nclist.pattern); |
8229 | new->nclist.next = copynode(n->nclist.next); | 8267 | new->nclist.next = copynode(n->nclist.next); |
8268 | SAVE_PTR3(new->nclist.body,new->nclist.pattern,new->nclist.next); | ||
8230 | break; | 8269 | break; |
8231 | case NDEFUN: | 8270 | case NDEFUN: |
8232 | case NARG: | 8271 | case NARG: |
8233 | new->narg.backquote = copynodelist(n->narg.backquote); | 8272 | new->narg.backquote = copynodelist(n->narg.backquote); |
8234 | new->narg.text = nodeckstrdup(n->narg.text); | 8273 | new->narg.text = nodeckstrdup(n->narg.text); |
8235 | new->narg.next = copynode(n->narg.next); | 8274 | new->narg.next = copynode(n->narg.next); |
8275 | SAVE_PTR3(new->narg.backquote,new->narg.text,new->narg.next); | ||
8236 | break; | 8276 | break; |
8237 | case NTO: | 8277 | case NTO: |
8238 | #if ENABLE_ASH_BASH_COMPAT | 8278 | #if ENABLE_ASH_BASH_COMPAT |
@@ -8245,6 +8285,7 @@ copynode(union node *n) | |||
8245 | new->nfile.fname = copynode(n->nfile.fname); | 8285 | new->nfile.fname = copynode(n->nfile.fname); |
8246 | new->nfile.fd = n->nfile.fd; | 8286 | new->nfile.fd = n->nfile.fd; |
8247 | new->nfile.next = copynode(n->nfile.next); | 8287 | new->nfile.next = copynode(n->nfile.next); |
8288 | SAVE_PTR2(new->nfile.fname,new->nfile.next); | ||
8248 | break; | 8289 | break; |
8249 | case NTOFD: | 8290 | case NTOFD: |
8250 | case NFROMFD: | 8291 | case NFROMFD: |
@@ -8252,15 +8293,18 @@ copynode(union node *n) | |||
8252 | new->ndup.dupfd = n->ndup.dupfd; | 8293 | new->ndup.dupfd = n->ndup.dupfd; |
8253 | new->ndup.fd = n->ndup.fd; | 8294 | new->ndup.fd = n->ndup.fd; |
8254 | new->ndup.next = copynode(n->ndup.next); | 8295 | new->ndup.next = copynode(n->ndup.next); |
8296 | SAVE_PTR2(new->ndup.vname,new->ndup.next); | ||
8255 | break; | 8297 | break; |
8256 | case NHERE: | 8298 | case NHERE: |
8257 | case NXHERE: | 8299 | case NXHERE: |
8258 | new->nhere.doc = copynode(n->nhere.doc); | 8300 | new->nhere.doc = copynode(n->nhere.doc); |
8259 | new->nhere.fd = n->nhere.fd; | 8301 | new->nhere.fd = n->nhere.fd; |
8260 | new->nhere.next = copynode(n->nhere.next); | 8302 | new->nhere.next = copynode(n->nhere.next); |
8303 | SAVE_PTR2(new->nhere.doc,new->nhere.next); | ||
8261 | break; | 8304 | break; |
8262 | case NNOT: | 8305 | case NNOT: |
8263 | new->nnot.com = copynode(n->nnot.com); | 8306 | new->nnot.com = copynode(n->nnot.com); |
8307 | SAVE_PTR(new->nnot.com); | ||
8264 | break; | 8308 | break; |
8265 | }; | 8309 | }; |
8266 | new->type = n->type; | 8310 | new->type = n->type; |
@@ -8283,6 +8327,7 @@ copyfunc(union node *n) | |||
8283 | f = ckmalloc(blocksize + funcstringsize); | 8327 | f = ckmalloc(blocksize + funcstringsize); |
8284 | funcblock = (char *) f + offsetof(struct funcnode, n); | 8328 | funcblock = (char *) f + offsetof(struct funcnode, n); |
8285 | funcstring = (char *) f + blocksize; | 8329 | funcstring = (char *) f + blocksize; |
8330 | IF_PLATFORM_MINGW32(nodeptr = NULL); | ||
8286 | copynode(n); | 8331 | copynode(n); |
8287 | f->count = 0; | 8332 | f->count = 0; |
8288 | return f; | 8333 | return f; |