aboutsummaryrefslogtreecommitdiff
path: root/strlib.c
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>1997-07-04 19:35:38 -0300
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>1997-07-04 19:35:38 -0300
commitda4dbe65b268a76a10f8294350aba0b239a0fbda (patch)
tree64cf72686fce0e5e1af1bcfb7e42ac0d48650ce5 /strlib.c
parent4321fde2a7059b5d5adcedd4f607f695ea30ff8b (diff)
downloadlua-da4dbe65b268a76a10f8294350aba0b239a0fbda.tar.gz
lua-da4dbe65b268a76a10f8294350aba0b239a0fbda.tar.bz2
lua-da4dbe65b268a76a10f8294350aba0b239a0fbda.zip
new functionality for "format": "%d$...".
Diffstat (limited to 'strlib.c')
-rw-r--r--strlib.c26
1 files changed, 16 insertions, 10 deletions
diff --git a/strlib.c b/strlib.c
index b576b265..6d16043a 100644
--- a/strlib.c
+++ b/strlib.c
@@ -3,7 +3,7 @@
3** String library to LUA 3** String library to LUA
4*/ 4*/
5 5
6char *rcs_strlib="$Id: strlib.c,v 1.45 1997/06/19 17:45:28 roberto Exp roberto $"; 6char *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)
468static void str_format (void) 468static 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'");