aboutsummaryrefslogtreecommitdiff
path: root/shell
diff options
context:
space:
mode:
authorNguyễn Thái Ngọc Duy <pclouds@gmail.com>2010-04-14 00:31:43 +0200
committerNguyễn Thái Ngọc Duy <pclouds@gmail.com>2010-04-20 19:14:43 +0200
commitf7ac25c247dd4274b10c672003ed424695c375cb (patch)
treea4dad307e47e43b3b474bbe6c9862c81b30ee4e9 /shell
parent64ab89438d39b9ffa30f6b5fb1867b0fb11f28f1 (diff)
downloadbusybox-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.c45
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 */
8012static int funcstringsize; /* size of strings in node */ 8012static int funcstringsize; /* size of strings in node */
8013static void *funcblock; /* block to allocate function from */ 8013static void *funcblock; /* block to allocate function from */
8014static char *funcstring; /* block to allocate strings from */ 8014static char *funcstring; /* block to allocate strings from */
8015#if ENABLE_PLATFORM_MINGW32
8016static int nodeptrsize;
8017static 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
8158static union node *copynode(union node *); 8176static 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
8160static struct nodelist * 8190static struct nodelist *
8161copynodelist(struct nodelist *lp) 8191copynodelist(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;