svnno****@sourc*****
svnno****@sourc*****
2014年 11月 1日 (土) 11:48:51 JST
Revision: 5693 http://sourceforge.jp/projects/ttssh2/scm/svn/commits/5693 Author: maya Date: 2014-11-01 11:48:46 +0900 (Sat, 01 Nov 2014) Log Message: ----------- sprintf, sprintf2 マクロコマンドで width, precision に * を受け付けられるようにした Modified Paths: -------------- trunk/teraterm/ttpmacro/ttl.c -------------- next part -------------- Modified: trunk/teraterm/ttpmacro/ttl.c =================================================================== --- trunk/teraterm/ttpmacro/ttl.c 2014-10-31 14:46:03 UTC (rev 5692) +++ trunk/teraterm/ttpmacro/ttl.c 2014-11-01 02:48:46 UTC (rev 5693) @@ -4262,12 +4262,14 @@ WORD TTLSprintf(int getvar) { TStrVal Fmt; - int Num; + int Num, NumWidth, NumPrecision; TStrVal Str; WORD Err = 0, TmpErr; TVarId VarId; char buf[MaxStrLen]; char *p, subFmt[MaxStrLen], buf2[MaxStrLen]; + int width_asterisk, precision_asterisk, reg_beg, reg_end, reg_len, i; + char *match_str; enum arg_type { INTEGER, @@ -4292,7 +4294,11 @@ } } - pattern = (UChar* )"^%[-+0 #]*(?:[1-9][0-9]*)?(?:\\.[0-9]*)?$"; +// pattern = (UChar* )"^%[-+0 #]*(?:[1-9][0-9]*)?(?:\\.[0-9]*)?$"; + pattern = (UChar* )"^%[-+0 #]*([1-9][0-9]*|\\*)?(?:\\.([0-9]*|\\*))?$"; + // flags-------- + // width------------------ + // precision-------------------- r = onig_new(®, pattern, pattern + strlen(pattern), ONIG_OPTION_NONE, ONIG_ENCODING_ASCII, ONIG_SYNTAX_DEFAULT, @@ -4374,16 +4380,87 @@ strncat_s(subFmt, sizeof(subFmt), p, 1); + // width, precision \x82\xAA * \x82\xA9\x82ǂ\xA4\x82\xA9\x83`\x83F\x83b\x83N + width_asterisk = precision_asterisk = 0; + if (region->num_regs != 3) { + SetResult(-1); + goto exit2; + } + reg_beg = region->beg[1]; + reg_end = region->end[1]; + reg_len = reg_end - reg_beg; + match_str = (char*)calloc(reg_len + 1, sizeof(char)); + for (i = 0; i < reg_len; i++) { + match_str[i] = str[reg_beg + i]; + } + if (strcmp(match_str, "*") == 0) { + width_asterisk = 1; + } + free(match_str); + reg_beg = region->beg[2]; + reg_end = region->end[2]; + reg_len = reg_end - reg_beg; + match_str = (char*)calloc(reg_len + 1, sizeof(char)); + for (i = 0; i < reg_len; i++) { + match_str[i] = str[reg_beg + i]; + } + if (strcmp(match_str, "*") == 0) { + precision_asterisk = 1; + } + free(match_str); + + // * \x82ɑΉ\x9E\x82\xB7\x82\xE9\x88\xF8\x90\x94\x82\xF0\x8E擾 + if (width_asterisk) { + TmpErr = 0; + GetIntVal(&NumWidth, &TmpErr); + if (TmpErr != 0) { + SetResult(3); + Err = TmpErr; + goto exit1; + } + } + if (precision_asterisk) { + TmpErr = 0; + GetIntVal(&NumPrecision, &TmpErr); + if (TmpErr != 0) { + SetResult(3); + Err = TmpErr; + goto exit1; + } + } + if (type == STRING || type == DOUBLE) { // \x95\xB6\x8E\x9A\x97\xF1\x82Ƃ\xB5\x82ēǂ߂邩\x83g\x83\x89\x83C TmpErr = 0; GetStrVal(Str, &TmpErr); if (TmpErr == 0) { if (type == STRING) { - _snprintf_s(buf2, sizeof(buf2), _TRUNCATE, subFmt, Str); + if (!width_asterisk && !precision_asterisk) { + _snprintf_s(buf2, sizeof(buf2), _TRUNCATE, subFmt, Str); + } + else if (width_asterisk && !precision_asterisk) { + _snprintf_s(buf2, sizeof(buf2), _TRUNCATE, subFmt, NumWidth, Str); + } + else if (!width_asterisk && precision_asterisk) { + _snprintf_s(buf2, sizeof(buf2), _TRUNCATE, subFmt, NumPrecision, Str); + } + else { // width_asterisk && precision_asterisk + _snprintf_s(buf2, sizeof(buf2), _TRUNCATE, subFmt, NumWidth, NumPrecision, Str); + } } else { // DOUBLE - _snprintf_s(buf2, sizeof(buf2), _TRUNCATE, subFmt, atof(Str)); + if (!width_asterisk && !precision_asterisk) { + _snprintf_s(buf2, sizeof(buf2), _TRUNCATE, subFmt, atof(Str)); + } + else if (width_asterisk && !precision_asterisk) { + _snprintf_s(buf2, sizeof(buf2), _TRUNCATE, subFmt, NumWidth, atof(Str)); + } + else if (!width_asterisk && precision_asterisk) { + _snprintf_s(buf2, sizeof(buf2), _TRUNCATE, subFmt, NumPrecision, atof(Str)); + } + else { // width_asterisk && precision_asterisk + _snprintf_s(buf2, sizeof(buf2), _TRUNCATE, subFmt, NumWidth, NumPrecision, atof(Str)); + } } } else { @@ -4397,7 +4474,18 @@ TmpErr = 0; GetIntVal(&Num, &TmpErr); if (TmpErr == 0) { - _snprintf_s(buf2, sizeof(buf2), _TRUNCATE, subFmt, Num); + if (!width_asterisk && !precision_asterisk) { + _snprintf_s(buf2, sizeof(buf2), _TRUNCATE, subFmt, Num); + } + else if (width_asterisk && !precision_asterisk) { + _snprintf_s(buf2, sizeof(buf2), _TRUNCATE, subFmt, NumWidth, Num); + } + else if (!width_asterisk && precision_asterisk) { + _snprintf_s(buf2, sizeof(buf2), _TRUNCATE, subFmt, NumPrecision, Num); + } + else { // width_asterisk && precision_asterisk + _snprintf_s(buf2, sizeof(buf2), _TRUNCATE, subFmt, NumWidth, NumPrecision, Num); + } } else { SetResult(3); @@ -4408,6 +4496,7 @@ strncat_s(buf, sizeof(buf), buf2, _TRUNCATE); memset(subFmt, 0, sizeof(subFmt)); + onig_region_free(region, 0); break; default: