diff options
| author | Simon Robertshaw <simon@hardwired.org.uk> | 2011-12-10 19:03:31 (GMT) |
|---|---|---|
| committer | Simon Robertshaw <simon@hardwired.org.uk> | 2011-12-10 19:03:31 (GMT) |
| commit | 03352ca1f4115eff5efac7547c3e507bce656496 (patch) | |
| tree | 58f13bbe5039efdec64c17a2394df0250ef1277b /src | |
| parent | eec2363dc00f59aae2a9716fa963716b920c8bf3 (diff) | |
| download | powder-03352ca1f4115eff5efac7547c3e507bce656496.zip powder-03352ca1f4115eff5efac7547c3e507bce656496.tar.gz | |
Fix memory leaks, allow changing of element name (To fix: element names in some arrays out of sync)
Diffstat (limited to 'src')
| -rw-r--r-- | src/console.c | 4 | ||||
| -rw-r--r-- | src/luaconsole.c | 38 |
2 files changed, 33 insertions, 9 deletions
diff --git a/src/console.c b/src/console.c index c9714a1..6d8ffe2 100644 --- a/src/console.c +++ b/src/console.c @@ -20,14 +20,14 @@ int console_parse_type(char *txt, int *element, char *err) else if (strcasecmp(txt,"NONE")==0) i = PT_NONE; if (i>=0 && i<PT_NUM && ptypes[i].enabled) { - *element = i; + if (element) *element = i; if (err) strcpy(err,""); return 1; } for (i=1; i<PT_NUM; i++) { if (strcasecmp(txt,ptypes[i].name)==0 && ptypes[i].enabled) { - *element = i; + if (element) *element = i; if (err) strcpy(err,""); return 1; } diff --git a/src/luaconsole.c b/src/luaconsole.c index c60fdf4..8151328 100644 --- a/src/luaconsole.c +++ b/src/luaconsole.c @@ -200,6 +200,7 @@ int luacon_partread(lua_State* l){ int i; char * key = mystrdup(luaL_optstring(l, 2, "")); offset = luacon_particle_getproperty(key, &format); + free(key); //Get Raw Index value for particle lua_pushstring(l, "id"); @@ -227,7 +228,6 @@ int luacon_partread(lua_State* l){ lua_pushnumber(l, tempfloat); break; } - free(key); return 1; } int luacon_partwrite(lua_State* l){ @@ -238,6 +238,7 @@ int luacon_partwrite(lua_State* l){ int i; char * key = mystrdup(luaL_optstring(l, 2, "")); offset = luacon_particle_getproperty(key, &format); + free(key); //Get Raw Index value for particle lua_pushstring(l, "id"); @@ -263,7 +264,6 @@ int luacon_partwrite(lua_State* l){ *((float*)(((void*)&parts[i])+offset)) = luaL_optnumber(l, 3, 0); break; } - free(key); return 1; } int luacon_partsread(lua_State* l){ @@ -377,6 +377,7 @@ int luacon_transitionread(lua_State* l){ int i; char * key = mystrdup(luaL_optstring(l, 2, "")); offset = luacon_transition_getproperty(key, &format); + free(key); //Get Raw Index value for element lua_pushstring(l, "value"); @@ -401,7 +402,6 @@ int luacon_transitionread(lua_State* l){ lua_pushnumber(l, tempfloat); break; } - free(key); return 1; } int luacon_transitionwrite(lua_State* l){ @@ -411,6 +411,7 @@ int luacon_transitionwrite(lua_State* l){ int i; char * key = mystrdup(luaL_optstring(l, 2, "")); offset = luacon_transition_getproperty(key, &format); + free(key); //Get Raw Index value for element lua_pushstring(l, "value"); @@ -433,17 +434,20 @@ int luacon_transitionwrite(lua_State* l){ *((float*)(((void*)&ptransitions[i])+offset)) = luaL_optnumber(l, 3, 0); break; } - free(key); return 0; } int luacon_element_getproperty(char * key, int * format) { int offset; - if (strcmp(key, "color")==0){ + if (strcmp(key, "name")==0){ + offset = offsetof(part_type, name); + *format = 2; + } + else if (strcmp(key, "color")==0){ offset = offsetof(part_type, pcolors); *format = 0; } - if (strcmp(key, "colour")==0){ + else if (strcmp(key, "colour")==0){ offset = offsetof(part_type, pcolors); *format = 0; } @@ -548,6 +552,7 @@ int luacon_elementread(lua_State* l){ int i; char * key = mystrdup(luaL_optstring(l, 2, "")); offset = luacon_element_getproperty(key, &format); + free(key); //Get Raw Index value for element lua_pushstring(l, "value"); @@ -580,7 +585,6 @@ int luacon_elementread(lua_State* l){ lua_pushnumber(l, tempinteger); break; } - free(key); return 1; } int luacon_elementwrite(lua_State* l){ @@ -602,6 +606,7 @@ int luacon_elementwrite(lua_State* l){ if(i < 0 || i >= PT_NUM || offset==-1) { + free(key); return luaL_error(l, "Invalid property"); } switch(format) @@ -614,6 +619,25 @@ int luacon_elementwrite(lua_State* l){ break; case 2: tempstring = mystrdup(luaL_optstring(l, 3, "")); + if(strcmp(key, "name")==0) + { + int j = 0; + //Convert to upper case + for(j = 0; j < strlen(tempstring); j++) + tempstring[j] = toupper(tempstring[j]); + if(strlen(tempstring)>4) + { + free(tempstring); + free(key); + return luaL_error(l, "Name too long"); + } + if(console_parse_type(tempstring, NULL, NULL)) + { + free(tempstring); + free(key); + return luaL_error(l, "Name in use"); + } + } *((char**)(((void*)&ptypes[i])+offset)) = tempstring; //Need some way of cleaning up previous values break; |
