From c3abc4f55388cb86f06655a1888b682b0e5d6a34 Mon Sep 17 00:00:00 2001 From: Armando Rivera Date: Wed, 6 Nov 2013 20:08:19 -0500 Subject: [PATCH] Initial Commit --- .gitignore | 5 ++ Keywords.txt | 63 +++++++++++++ Prototypes.txt | 17 ++++ cppbas.inc | 90 +++++++++++++++++++ cppbasrt.inc | 204 +++++++++++++++++++++++++++++++++++++++++++ demo.cpp | 76 ++++++++++++++++ generate-keywords.sh | 17 ++++ readme.txt | 7 ++ 8 files changed, 479 insertions(+) create mode 100644 .gitignore create mode 100644 Keywords.txt create mode 100644 Prototypes.txt create mode 100644 cppbas.inc create mode 100644 cppbasrt.inc create mode 100644 demo.cpp create mode 100755 generate-keywords.sh create mode 100644 readme.txt diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..baa2f5a --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +demo +output.txt +*.exe +*.swp + diff --git a/Keywords.txt b/Keywords.txt new file mode 100644 index 0000000..72aaef1 --- /dev/null +++ b/Keywords.txt @@ -0,0 +1,63 @@ +_TO_ +ADDRESS +AND +AS +BEGIN +BOOL +BYREF +CASE +CASE_ELSE +CLASS +CONSTANT +DECLARE +DECR +DIM +ELSE +ENC$ +END +ENDCASE +ENDFUNCTION +ENDIF +ENDMAIN +ENDSELECT +ENDSUB +FALSE REVERSE$ +FOR +FUNCTION +IF +INCR +INSTR +INT +LCASE$ +LEFT$ +LOADFILE$ +LTRIM$ +MAIN +MAP +MCASE$ +MID$ +NEXT +NOT +OR +PRIOR +REPLACE$ +RETURN +RIGHT$ +RTRIM$ +SAVEFILE +SELECT +SPLITPATH$ +STEP +STR$ +SUB +THEN +TO +TRIM$ +TRUE +TYPE +UCASE$ +UINT +VAL \nPRINT +VECTOR +WEND +WHILE diff --git a/Prototypes.txt b/Prototypes.txt new file mode 100644 index 0000000..2d9c565 --- /dev/null +++ b/Prototypes.txt @@ -0,0 +1,17 @@ +ENC$ (CSTRING A, INT L, INT R) +INSTR (CSTRING s,CSTRING match, size_t offset) +LCASE$ (CSTRING str) +LEFT$ (CSTRING s, INT length) +LOADFILE$ (CSTRING N) +LTRIM$ (CSTRING s) +MCASE$ (CSTRING S) +MID$ (CSTRING s, INT start, INT length) +REPLACE$ (CSTRING subject, CONSTANT CSTRING& search, CONSTANT CSTRING& replace) +REVERSE$ (CSTRING src) +RIGHT$ (CSTRING s, INT length) +RTRIM$ (CSTRING s) +SAVEFILE (CSTRING src, CSTRING fname) +SPLITPATH$ (CSTRING FPATH, INT mask) +TRIM$ (CSTRING s) +UCASE$ (CSTRING str) +VAL (CSTRING str) \nPRINT (CSTRING A="") diff --git a/cppbas.inc b/cppbas.inc new file mode 100644 index 0000000..8726d66 --- /dev/null +++ b/cppbas.inc @@ -0,0 +1,90 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#ifndef _WIN32 + #include + #include +#endif +#include +#include +#include +#include +#include +#include +#include + +/* DEFINES */ +#define MAIN int main (int argc, char** argv) { +#define ENDMAIN } +#define DECLARE +#define FUNCTION +#define ENDFUNCTION } +#define DIM +#define AS +#define SUB void +#define ENDSUB } +#define BEGIN { +#define END } +#define AND && +#define OR || +#define CLASS class +#define TYPE typedef struct +#define ADDRESS & +#define INCR ++ +#define DECR -- +#define NEXT ++ +#define PRIOR -- +#define BYREF * +#define NOT not +#define IF if +#define THEN { +#define ELSE } else { +#define ENDIF } +#define FOR for +#define TO ; +#define STEP ; +#define SELECT switch +#define CASE case +#define _TO_ ... +#define ENDCASE break; +#define CASE_ELSE default +#define ENDSELECT } +#define WHILE while +#define WEND } +#define RETURN return +#define CONSTANT const +#define STR$( x ) dynamic_cast< std::ostringstream & >( ( std::ostringstream() << std::dec << x ) ).str() +#define BOOL bool +#define INT int +#define UINT unsigned int +#define VECTOR std::vector +#define MAP std::map + +#ifndef TRUE + #define TRUE 1 +#endif + +#ifndef FALSE + #define FALSE 0 +#endif + +/* TYPEDEFS */ +typedef std::string CSTRING; + + +char LF [2]= {10,0}; // Line Feed + +#include "cppbasrt.inc" + diff --git a/cppbasrt.inc b/cppbasrt.inc new file mode 100644 index 0000000..ab35f66 --- /dev/null +++ b/cppbasrt.inc @@ -0,0 +1,204 @@ +DECLARE FUNCTION CSTRING LTRIM$ (CSTRING); +DECLARE FUNCTION CSTRING RTRIM$ (CSTRING); +DECLARE FUNCTION CSTRING TRIM$ (CSTRING); +DECLARE FUNCTION CSTRING LEFT$ (CSTRING, INT); +DECLARE FUNCTION CSTRING MID$ (CSTRING, INT, INT); +DECLARE FUNCTION CSTRING RIGHT$ (CSTRING, INT); +DECLARE FUNCTION INT INSTR (CSTRING,CSTRING,size_t=0); +DECLARE FUNCTION CSTRING LCASE$ (CSTRING); +DECLARE FUNCTION CSTRING UCASE$ (CSTRING); +DECLARE FUNCTION CSTRING MCASE$ (CSTRING); +DECLARE FUNCTION CSTRING LOADFILE$ (CSTRING); +DECLARE FUNCTION CSTRING SPLITPATH$ (CSTRING, INT); +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 SUB PRINT (CSTRING); +DECLARE SUB SAVEFILE(CSTRING src, CSTRING fname); + + +FUNCTION CSTRING REVERSE$ (CSTRING src) BEGIN + RETURN CSTRING( src.rbegin(),src.rend() ); +ENDFUNCTION + +SUB PRINT (CSTRING A="") BEGIN + IF (A.empty()) THEN + std::cout << std::endl; + ELSE + std::cout << A << std::endl; + ENDIF +ENDSUB + +FUNCTION CSTRING LTRIM$ (CSTRING s) BEGIN + s.erase(s.begin(),std::find_if(s.begin(),s.end(),std::not1(std::ptr_fun(std::isspace)))); + RETURN s; +ENDFUNCTION + + +FUNCTION CSTRING RTRIM$ (CSTRING s) BEGIN + s.erase(std::find_if(s.rbegin(),s.rend(),std::not1(std::ptr_fun(std::isspace))).base(),s.end()); + RETURN s; +ENDFUNCTION + + +FUNCTION CSTRING TRIM$ (CSTRING s) BEGIN + RETURN LTRIM$ (RTRIM$ (s)); +ENDFUNCTION + + +FUNCTION CSTRING LEFT$ (CSTRING s, INT length) BEGIN + RETURN s.substr(0,length); +ENDFUNCTION + + +FUNCTION CSTRING MID$ (CSTRING s, INT start, INT length) BEGIN + RETURN s.substr(start,length); +ENDFUNCTION + + +FUNCTION CSTRING RIGHT$ (CSTRING s, INT length) BEGIN + RETURN s.substr(s.size()-length); +ENDFUNCTION + + +FUNCTION INT INSTR (CSTRING s,CSTRING match, size_t offset) BEGIN + IF (s.empty() OR match.empty() OR offset>s.length()) THEN + RETURN 0; + ENDIF + RETURN s.find(match,offset); +ENDFUNCTION + + +FUNCTION CSTRING LCASE$ (CSTRING str) BEGIN + DIM AS CSTRING name(str); + std::transform(name.begin(),name.end(),name.begin(),::tolower); + RETURN name; +ENDFUNCTION + + +FUNCTION CSTRING UCASE$ (CSTRING str) BEGIN + DIM AS CSTRING name(str); + std::transform(name.begin(),name.end(),name.begin(),::toupper); + RETURN name; +ENDFUNCTION + + +FUNCTION CSTRING MCASE$ (CSTRING S) BEGIN + DIM AS CSTRING tmpStr(S); + DIM AS bool capFlag; + DIM AS register size_t i; + + + std::transform(tmpStr.begin(),tmpStr.end(),tmpStr.begin(),::tolower); + + FOR (i=0 TO i<=tmpStr.length() STEP i++) BEGIN + IF (std::ispunct(tmpStr[i]) OR std::isspace(tmpStr[i])) THEN + capFlag=FALSE; + ENDIF + + IF (capFlag==FALSE AND std::isalpha(tmpStr[i])) THEN + tmpStr[i]=std::toupper(tmpStr[i]); + capFlag=TRUE; + ENDIF + END + RETURN tmpStr; +ENDFUNCTION + + +FUNCTION CSTRING LOADFILE$ (CSTRING N) BEGIN + DIM AS CSTRING line, tmpStr; + DIM AS std::ifstream myFile(N.c_str()); + + IF( NOT myFile.good()) BEGIN + PRINT("Error opening file"); + RETURN "ERROR"; + ENDIF + + WHILE ( NOT myFile.eof()) BEGIN + getline(myFile,line); + line+=LF; + tmpStr+=line; + WEND + + myFile.close(); + + RETURN tmpStr; + +ENDFUNCTION + +SUB SAVEFILE (CSTRING src, CSTRING fname) BEGIN + DIM AS std::ofstream outfile; + + outfile.open(fname.c_str()); + outfile << src; + outfile.close(); + +ENDSUB + +FUNCTION CSTRING SPLITPATH$ (CSTRING FPATH, INT mask) BEGIN + DIM AS CSTRING fullPath(FPATH); + DIM AS CSTRING path, filename, extension; + DIM AS CSTRING::size_type lastSlashPos, extPos; + + lastSlashPos=fullPath.find_last_of("/"); + extPos=fullPath.find_last_of("."); + IF (lastSlashPos==CSTRING::npos) THEN + path.empty(); + filename=fullPath; + ELSE + path=fullPath.substr(0,lastSlashPos); + filename=fullPath.substr(lastSlashPos+1,(extPos-lastSlashPos)-1); + ENDIF + + IF (extPos==CSTRING::npos) THEN + extension.empty(); + ELSE + extension=fullPath.substr(extPos+1,fullPath.size()-extPos-1); + ENDIF + + SELECT (mask) BEGIN + CASE 4: + RETURN path; + ENDCASE + + CASE 8: + RETURN filename; + ENDCASE + + CASE 12: + RETURN path.append("/").append(filename); + ENDCASE + + CASE 16: + RETURN extension; + ENDCASE + + CASE_ELSE: + RETURN ""; + + ENDSELECT + +ENDFUNCTION + + +FUNCTION CSTRING ENC$ (CSTRING A, INT L, INT R) BEGIN + DIM AS std::stringstream buf; + buf<<(char)L< Keywords.txt +echo "$PROTO" | sort > Prototypes.txt +echo "Done." + diff --git a/readme.txt b/readme.txt new file mode 100644 index 0000000..cb3dc6d --- /dev/null +++ b/readme.txt @@ -0,0 +1,7 @@ +Compile with: g++ demo.cpp -o demo (or if using clang, use clang++ demo.cpp -o demo) + +This is just a proof of concept of using a BASIC-like syntax to program C++. + +For the list of current Keywords, see the Keywords.txt file + +For the Function/Sub prototypes, see the Prototypes.txt file \ No newline at end of file