diff options
| author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2013-04-25 10:52:13 -0300 |
|---|---|---|
| committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2013-04-25 10:52:13 -0300 |
| commit | 944709c77b8471c4cf95e3a76d812c6e643338a0 (patch) | |
| tree | f21f6d28b75b3c80ec7f0f1f448e612b8ff794e3 | |
| parent | 52cb90ec759e3569e1edf1f73549d5a07043727d (diff) | |
| download | lua-944709c77b8471c4cf95e3a76d812c6e643338a0.tar.gz lua-944709c77b8471c4cf95e3a76d812c6e643338a0.tar.bz2 lua-944709c77b8471c4cf95e3a76d812c6e643338a0.zip | |
more definitions to support integer formatting
| -rw-r--r-- | lstrlib.c | 68 | ||||
| -rw-r--r-- | luaconf.h | 34 |
2 files changed, 36 insertions, 66 deletions
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: lstrlib.c,v 1.177 2012/07/31 17:48:42 roberto Exp roberto $ | 2 | ** $Id: lstrlib.c,v 1.178 2012/08/14 18:12:34 roberto Exp roberto $ |
| 3 | ** Standard library for string operations and pattern-matching | 3 | ** Standard library for string operations and pattern-matching |
| 4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
| 5 | */ | 5 | */ |
| @@ -786,48 +786,17 @@ static int str_gsub (lua_State *L) { | |||
| 786 | ** ======================================================= | 786 | ** ======================================================= |
| 787 | */ | 787 | */ |
| 788 | 788 | ||
| 789 | /* | ||
| 790 | ** LUA_INTFRMLEN is the length modifier for integer conversions in | ||
| 791 | ** 'string.format'; LUA_INTFRM_T is the integer type corresponding to | ||
| 792 | ** the previous length | ||
| 793 | */ | ||
| 794 | #if !defined(LUA_INTFRMLEN) /* { */ | ||
| 795 | #if defined(LUA_USE_LONGLONG) | ||
| 796 | |||
| 797 | #define LUA_INTFRMLEN "ll" | ||
| 798 | #define LUA_INTFRM_T long long | ||
| 799 | |||
| 800 | #else | ||
| 801 | |||
| 802 | #define LUA_INTFRMLEN "l" | ||
| 803 | #define LUA_INTFRM_T long | ||
| 804 | |||
| 805 | #endif | ||
| 806 | #endif /* } */ | ||
| 807 | |||
| 808 | |||
| 809 | /* | ||
| 810 | ** LUA_FLTFRMLEN is the length modifier for float conversions in | ||
| 811 | ** 'string.format'; LUA_FLTFRM_T is the float type corresponding to | ||
| 812 | ** the previous length | ||
| 813 | */ | ||
| 814 | #if !defined(LUA_FLTFRMLEN) | ||
| 815 | |||
| 816 | #define LUA_FLTFRMLEN "" | ||
| 817 | #define LUA_FLTFRM_T double | ||
| 818 | |||
| 819 | #endif | ||
| 820 | |||
| 821 | |||
| 822 | /* maximum size of each formatted item (> len(format('%99.99f', -1e308))) */ | 789 | /* maximum size of each formatted item (> len(format('%99.99f', -1e308))) */ |
| 823 | #define MAX_ITEM 512 | 790 | #define MAX_ITEM 512 |
| 791 | |||
| 824 | /* valid flags in a format specification */ | 792 | /* valid flags in a format specification */ |
| 825 | #define FLAGS "-+ #0" | 793 | #define FLAGS "-+ #0" |
| 794 | |||
| 826 | /* | 795 | /* |
| 827 | ** maximum size of each format specification (such as '%-099.99d') | 796 | ** maximum size of each format specification (such as "%-099.99d") |
| 828 | ** (+10 accounts for %99.99x plus margin of error) | 797 | ** (+2 for length modifiers; +10 accounts for %99.99x plus margin of error) |
| 829 | */ | 798 | */ |
| 830 | #define MAX_FORMAT (sizeof(FLAGS) + sizeof(LUA_INTFRMLEN) + 10) | 799 | #define MAX_FORMAT (sizeof(FLAGS) + 2 + 10) |
| 831 | 800 | ||
| 832 | 801 | ||
| 833 | static void addquoted (lua_State *L, luaL_Buffer *b, int arg) { | 802 | static void addquoted (lua_State *L, luaL_Buffer *b, int arg) { |
| @@ -914,24 +883,11 @@ static int str_format (lua_State *L) { | |||
| 914 | nb = sprintf(buff, form, luaL_checkint(L, arg)); | 883 | nb = sprintf(buff, form, luaL_checkint(L, arg)); |
| 915 | break; | 884 | break; |
| 916 | } | 885 | } |
| 917 | case 'd': case 'i': { | 886 | case 'd': case 'i': |
| 918 | lua_Number n = luaL_checknumber(L, arg); | ||
| 919 | LUA_INTFRM_T ni = (LUA_INTFRM_T)n; | ||
| 920 | lua_Number diff = n - (lua_Number)ni; | ||
| 921 | luaL_argcheck(L, -1 < diff && diff < 1, arg, | ||
| 922 | "not a number in proper range"); | ||
| 923 | addlenmod(form, LUA_INTFRMLEN); | ||
| 924 | nb = sprintf(buff, form, ni); | ||
| 925 | break; | ||
| 926 | } | ||
| 927 | case 'o': case 'u': case 'x': case 'X': { | 887 | case 'o': case 'u': case 'x': case 'X': { |
| 928 | lua_Number n = luaL_checknumber(L, arg); | 888 | lua_Integer n = luaL_checkinteger(L, arg); |
| 929 | unsigned LUA_INTFRM_T ni = (unsigned LUA_INTFRM_T)n; | 889 | addlenmod(form, LUA_INTEGER_FRMLEN); |
| 930 | lua_Number diff = n - (lua_Number)ni; | 890 | nb = sprintf(buff, form, n); |
| 931 | luaL_argcheck(L, -1 < diff && diff < 1, arg, | ||
| 932 | "not a non-negative number in proper range"); | ||
| 933 | addlenmod(form, LUA_INTFRMLEN); | ||
| 934 | nb = sprintf(buff, form, ni); | ||
| 935 | break; | 891 | break; |
| 936 | } | 892 | } |
| 937 | case 'e': case 'E': case 'f': | 893 | case 'e': case 'E': case 'f': |
| @@ -939,8 +895,8 @@ static int str_format (lua_State *L) { | |||
| 939 | case 'a': case 'A': | 895 | case 'a': case 'A': |
| 940 | #endif | 896 | #endif |
| 941 | case 'g': case 'G': { | 897 | case 'g': case 'G': { |
| 942 | addlenmod(form, LUA_FLTFRMLEN); | 898 | addlenmod(form, LUA_NUMBER_FRMLEN); |
| 943 | nb = sprintf(buff, form, (LUA_FLTFRM_T)luaL_checknumber(L, arg)); | 899 | nb = sprintf(buff, form, luaL_checknumber(L, arg)); |
| 944 | break; | 900 | break; |
| 945 | } | 901 | } |
| 946 | case 'q': { | 902 | case 'q': { |
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: luaconf.h,v 1.175 2013/01/29 16:00:40 roberto Exp roberto $ | 2 | ** $Id: luaconf.h,v 1.176 2013/03/16 21:10:18 roberto Exp roberto $ |
| 3 | ** Configuration file for Lua | 3 | ** Configuration file for Lua |
| 4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
| 5 | */ | 5 | */ |
| @@ -394,13 +394,15 @@ | |||
| 394 | 394 | ||
| 395 | 395 | ||
| 396 | /* | 396 | /* |
| 397 | @@ LUA_NUMBER_SCAN is the format for reading numbers. | 397 | @@ LUA_NUMBER_FRMLEN is the length modifier for writing floats. |
| 398 | @@ LUA_NUMBER_FMT is the format for writing numbers. | 398 | @@ LUA_NUMBER_SCAN is the format for reading floats. |
| 399 | @@ lua_number2str converts a number to a string. | 399 | @@ LUA_NUMBER_FMT is the format for writing floats. |
| 400 | @@ lua_number2str converts a floats to a string. | ||
| 400 | @@ LUAI_MAXNUMBER2STR is maximum size of previous conversion. | 401 | @@ LUAI_MAXNUMBER2STR is maximum size of previous conversion. |
| 401 | */ | 402 | */ |
| 403 | #define LUA_NUMBER_FRMLEN "" | ||
| 402 | #define LUA_NUMBER_SCAN "%lf" | 404 | #define LUA_NUMBER_SCAN "%lf" |
| 403 | #define LUA_NUMBER_FMT "%.14g" | 405 | #define LUA_NUMBER_FMT "%.14" LUA_NUMBER_FRMLEN "g" |
| 404 | #define lua_number2str(s,n) sprintf((s), LUA_NUMBER_FMT, (n)) | 406 | #define lua_number2str(s,n) sprintf((s), LUA_NUMBER_FMT, (n)) |
| 405 | #define LUAI_MAXNUMBER2STR 32 /* 16 digits, sign, point, and \0 */ | 407 | #define LUAI_MAXNUMBER2STR 32 /* 16 digits, sign, point, and \0 */ |
| 406 | 408 | ||
| @@ -457,13 +459,25 @@ | |||
| 457 | ** CHANGE that if ptrdiff_t is not adequate on your machine. (On most | 459 | ** CHANGE that if ptrdiff_t is not adequate on your machine. (On most |
| 458 | ** machines, ptrdiff_t gives a good choice between int or long.) | 460 | ** machines, ptrdiff_t gives a good choice between int or long.) |
| 459 | */ | 461 | */ |
| 460 | #define LUA_INTEGER ptrdiff_t | 462 | #define LUA_INTEGER long long |
| 461 | 463 | ||
| 462 | /* | 464 | /* |
| 463 | @@ LUA_UNSIGNED is the integral type used by lua_pushunsigned/lua_tounsigned. | 465 | @@ LUA_UNSIGNED is the unsigned version of LUA_INTEGER. |
| 464 | ** It must have at least 32 bits. | ||
| 465 | */ | 466 | */ |
| 466 | #define LUA_UNSIGNED unsigned LUA_INT32 | 467 | #define LUA_UNSIGNED unsigned long long |
| 468 | |||
| 469 | /* | ||
| 470 | @@ LUA_INTEGER_FRMLEN is the length modifier for writing integers. | ||
| 471 | @@ LUA_INTEGER_SCAN is the format for reading integers. | ||
| 472 | @@ LUA_INTEGER_FMT is the format for writing integers. | ||
| 473 | @@ lua_integer2str converts an integer to a string. | ||
| 474 | @@ LUAI_MAXINTEGER2STR is maximum size of previous conversion. | ||
| 475 | */ | ||
| 476 | #define LUA_INTEGER_FRMLEN "ll" | ||
| 477 | #define LUA_INTEGER_SCAN "%Ld" | ||
| 478 | #define LUA_INTEGER_FMT "%" LUA_INTEGER_FRMLEN "d" | ||
| 479 | #define lua_integer2str(s,n) sprintf((s), LUA_INTEGER_FMT, (n)) | ||
| 480 | #define LUA_MAXINTEGER2STR 32 | ||
| 467 | 481 | ||
| 468 | 482 | ||
| 469 | 483 | ||
| @@ -471,7 +485,7 @@ | |||
| 471 | ** Some tricks with doubles | 485 | ** Some tricks with doubles |
| 472 | */ | 486 | */ |
| 473 | 487 | ||
| 474 | #if defined(LUA_NUMBER_DOUBLE) && !defined(LUA_ANSI) /* { */ | 488 | #if defined(LUA_NUMBER_DOUBLE) && !defined(LUA_ANSI) && 0 /* { */ |
| 475 | /* | 489 | /* |
| 476 | ** The next definitions activate some tricks to speed up the | 490 | ** The next definitions activate some tricks to speed up the |
| 477 | ** conversion from doubles to integer types, mainly to LUA_UNSIGNED. | 491 | ** conversion from doubles to integer types, mainly to LUA_UNSIGNED. |
