diff options
Diffstat (limited to '')
| -rw-r--r-- | strlib.c | 26 |
1 files changed, 16 insertions, 10 deletions
| @@ -3,7 +3,7 @@ | |||
| 3 | ** String library to LUA | 3 | ** String library to LUA |
| 4 | */ | 4 | */ |
| 5 | 5 | ||
| 6 | char *rcs_strlib="$Id: strlib.c,v 1.45 1997/06/19 17:45:28 roberto Exp roberto $"; | 6 | char *rcs_strlib="$Id: strlib.c,v 1.46 1997/06/19 18:49:40 roberto Exp roberto $"; |
| 7 | 7 | ||
| 8 | #include <string.h> | 8 | #include <string.h> |
| 9 | #include <stdio.h> | 9 | #include <stdio.h> |
| @@ -468,7 +468,7 @@ void luaI_addquoted (char *s) | |||
| 468 | static void str_format (void) | 468 | static void str_format (void) |
| 469 | { | 469 | { |
| 470 | int arg = 1; | 470 | int arg = 1; |
| 471 | char *strfrmt = luaL_check_string(arg++); | 471 | char *strfrmt = luaL_check_string(arg); |
| 472 | luaI_emptybuff(); /* initialize */ | 472 | luaI_emptybuff(); /* initialize */ |
| 473 | while (*strfrmt) { | 473 | while (*strfrmt) { |
| 474 | if (*strfrmt != '%') | 474 | if (*strfrmt != '%') |
| @@ -478,29 +478,35 @@ static void str_format (void) | |||
| 478 | else { /* format item */ | 478 | else { /* format item */ |
| 479 | char form[MAX_FORMAT]; /* store the format ('%...') */ | 479 | char form[MAX_FORMAT]; /* store the format ('%...') */ |
| 480 | char *buff; | 480 | char *buff; |
| 481 | char *initf = strfrmt-1; /* -1 to include % */ | 481 | char *initf = strfrmt; |
| 482 | strfrmt = match(strfrmt, "[-+ #]*(%d*)%.?(%d*)", 0); | 482 | form[0] = '%'; |
| 483 | strfrmt = match(strfrmt, "%d?%$?[-+ #]*(%d*)%.?(%d*)", 0); | ||
| 483 | if (capture[0].len > 3 || capture[1].len > 3) /* < 1000? */ | 484 | if (capture[0].len > 3 || capture[1].len > 3) /* < 1000? */ |
| 484 | lua_error("invalid format (width or precision too long)"); | 485 | lua_error("invalid format (width or precision too long)"); |
| 485 | strncpy(form, initf, strfrmt-initf+1); /* +1 to include convertion */ | 486 | if (isdigit((unsigned char)initf[0]) && initf[1] == '$') { |
| 486 | form[strfrmt-initf+1] = 0; | 487 | arg = initf[0] - '0'; |
| 488 | initf += 2; /* skip the 'n$' */ | ||
| 489 | } | ||
| 490 | arg++; | ||
| 491 | strncpy(form+1, initf, strfrmt-initf+1); /* +1 to include convertion */ | ||
| 492 | form[strfrmt-initf+2] = 0; | ||
| 487 | buff = openspace(1000); /* to store the formated value */ | 493 | buff = openspace(1000); /* to store the formated value */ |
| 488 | switch (*strfrmt++) { | 494 | switch (*strfrmt++) { |
| 489 | case 'q': | 495 | case 'q': |
| 490 | luaI_addquoted(luaL_check_string(arg++)); | 496 | luaI_addquoted(luaL_check_string(arg)); |
| 491 | continue; | 497 | continue; |
| 492 | case 's': { | 498 | case 's': { |
| 493 | char *s = luaL_check_string(arg++); | 499 | char *s = luaL_check_string(arg); |
| 494 | buff = openspace(strlen(s)); | 500 | buff = openspace(strlen(s)); |
| 495 | sprintf(buff, form, s); | 501 | sprintf(buff, form, s); |
| 496 | break; | 502 | break; |
| 497 | } | 503 | } |
| 498 | case 'c': case 'd': case 'i': case 'o': | 504 | case 'c': case 'd': case 'i': case 'o': |
| 499 | case 'u': case 'x': case 'X': | 505 | case 'u': case 'x': case 'X': |
| 500 | sprintf(buff, form, (int)luaL_check_number(arg++)); | 506 | sprintf(buff, form, (int)luaL_check_number(arg)); |
| 501 | break; | 507 | break; |
| 502 | case 'e': case 'E': case 'f': case 'g': | 508 | case 'e': case 'E': case 'f': case 'g': |
| 503 | sprintf(buff, form, luaL_check_number(arg++)); | 509 | sprintf(buff, form, luaL_check_number(arg)); |
| 504 | break; | 510 | break; |
| 505 | default: /* also treat cases 'pnLlh' */ | 511 | default: /* also treat cases 'pnLlh' */ |
| 506 | lua_error("invalid format option in function `format'"); | 512 | lua_error("invalid format option in function `format'"); |
