From 48c363f47b34dff47156a19492c75c590afbc3e6 Mon Sep 17 00:00:00 2001 From: Armando Rivera Date: Thu, 14 Nov 2013 22:14:30 -0500 Subject: [PATCH] Added FORMAT$ command to runtime --- demo.cpp | 4 ++++ runtime.inc | 27 +++++++++++++++++++++++++-- 2 files changed, 29 insertions(+), 2 deletions(-) diff --git a/demo.cpp b/demo.cpp index ceae027..6f4c88a 100644 --- a/demo.cpp +++ b/demo.cpp @@ -71,6 +71,10 @@ MAIN PRINT ( "SAVEFILE()" ); SAVEFILE(fileContents,"output.txt"); PRINT ( "Contents saved to 'output.txt'"); + PRINT (); + + PRINT ( "FORMAT$(\"%d %s\", 10, \"TEN\")" ); + PRINT ( FORMAT$("%d %s",10, "TEN") ); ENDMAIN diff --git a/runtime.inc b/runtime.inc index 8356657..5056155 100644 --- a/runtime.inc +++ b/runtime.inc @@ -14,10 +14,33 @@ DECLARE FUNCTION CSTRING ENC$ (CSTRING,INT=34,INT=34); DECLARE FUNCTION CSTRING REVERSE$ (CSTRING); DECLARE FUNCTION CSTRING REPLACE$ (CSTRING subject, CONSTANT CSTRING& search, CONSTANT CSTRING& replace); DECLARE FUNCTION INT VAL (CSTRING); +DECLARE FUNCTION CSTRING FORMAT$ (CONSTANT CSTRING &fmt, ...); DECLARE SUB PRINT (CSTRING); DECLARE SUB SAVEFILE(CSTRING src, CSTRING fname); +FUNCTION CSTRING FORMAT$ (CONSTANT CSTRING &fmt, ...) BEGIN + DIM AS VECTOR str(100,'\0'); + DIM AS va_list ap; + DIM AS INT n; + + WHILE (TRUE) { + va_start(ap, fmt); + n = vsnprintf(str.data(), str.size(), fmt.c_str(), ap); + va_end(ap); + IF ((n > -1) AND (size_t(n) < str.size())) THEN + RETURN str.data(); + ENDIF + IF (n > -1) THEN + str.resize( n + 1 ); + ELSE + str.resize( str.size() * 2); + ENDIF + WEND + + RETURN str.data(); +ENDFUNCTION + FUNCTION CSTRING REVERSE$ (CSTRING src) BEGIN RETURN CSTRING( src.rbegin(),src.rend() ); ENDFUNCTION @@ -88,7 +111,7 @@ FUNCTION CSTRING MCASE$ (CSTRING S) BEGIN DIM AS CSTRING tmpStr(S); DIM AS bool capFlag = FALSE; DIM AS register size_t i; - + std::transform(tmpStr.begin(),tmpStr.end(),tmpStr.begin(),::tolower); @@ -191,7 +214,7 @@ ENDFUNCTION FUNCTION CSTRING REPLACE$ (CSTRING subject, CONSTANT CSTRING& search, CONSTANT CSTRING& replace) BEGIN DIM AS size_t pos = 0; - + WHILE( ( pos = subject.find(search, pos) ) != CSTRING::npos) BEGIN subject.replace(pos, search.length(), replace); pos += replace.length();