From 63ec3785218141594180cf4cdb7c24f12489bcd0 Mon Sep 17 00:00:00 2001 From: PQCraft <58464017+PQCraft@users.noreply.github.com> Date: Thu, 5 Aug 2021 14:44:14 -0400 Subject: [PATCH] 0.18.1 CLIBASIC now cleans up stdin before exiting on *nix --- clibasic.c | 2 +- commands.c | 474 +++++++++++++++++++++++++++-------------------------- 2 files changed, 239 insertions(+), 237 deletions(-) diff --git a/clibasic.c b/clibasic.c index 7bee540..50ef0d3 100644 --- a/clibasic.c +++ b/clibasic.c @@ -114,7 +114,7 @@ // Base defines -char VER[] = "0.18"; +char VER[] = "0.18.1"; #if defined(__linux__) char OSVER[] = "Linux"; diff --git a/commands.c b/commands.c index 524ef4b..a459edd 100644 --- a/commands.c +++ b/commands.c @@ -305,188 +305,251 @@ if (chkCmd(2, "CHDIR", "CD")) { } goto noerr; } -if (chkCmd(1, "_RESETTITLE")) { - if (inProg) {cerr = 254; goto cmderr;} - cerr = 0; - if (argct != 0) {cerr = 3; goto cmderr;} - #ifndef _WIN_NO_VT - if (!changedtitle) { - if (changedtitlecmd) fputs("\e[23;0t", stdout); - goto noerr; - } - printf("\e]2;CLIBASIC %s (%s-bit)%c", VER, BVER, 7); - fflush(stdout); - #else - char* tmpstr = malloc(CB_BUF_SIZE); - sprintf(tmpstr, "CLIBASIC %s (%s-bit)", VER, BVER); - SetConsoleTitleA(tmpstr); - free(tmpstr); - #endif - goto noerr; -} -if (chkCmd(1, "_TITLE")) { - if (inProg) {cerr = 254; goto cmderr;} - cerr = 0; - if (argct != 1) {cerr = 3; goto cmderr;} - if (!solvearg(1)) goto cmderr; - if (argt[1] != 1) {cerr = 2; goto cmderr;} - #ifndef _WIN_NO_VT - if (!changedtitle) { - fputs("\e[22;0t", stdout); +if (arg[0][0] == '_') { + if (chkCmd(1, "_RESETTITLE")) { + if (inProg) {cerr = 254; goto cmderr;} + cerr = 0; + if (argct != 0) {cerr = 3; goto cmderr;} + #ifndef _WIN_NO_VT + if (!changedtitle) { + if (changedtitlecmd) fputs("\e[23;0t", stdout); + goto noerr; + } + printf("\e]2;CLIBASIC %s (%s-bit)%c", VER, BVER, 7); fflush(stdout); - changedtitle = true; + #else + char* tmpstr = malloc(CB_BUF_SIZE); + sprintf(tmpstr, "CLIBASIC %s (%s-bit)", VER, BVER); + SetConsoleTitleA(tmpstr); + free(tmpstr); + #endif + goto noerr; } - changedtitlecmd = true; - printf("\e]2;%s%c", arg[1], 7); - #else - SetConsoleTitleA(arg[1]); - #endif - goto noerr; -} -if (chkCmd(1, "_PROMPT")) { - if (inProg) {cerr = 254; goto cmderr;} - cerr = 0; - if (argct != 1) {cerr = 3; goto cmderr;} - if (!solvearg(1)) goto cmderr; - if (argt[1] != 1) {cerr = 2; goto cmderr;} - copyStr(tmpargs[1], prompt); - goto noerr; -} -if (chkCmd(1, "_PROMPTTAB")) { - if (inProg) {cerr = 254; goto cmderr;} - cerr = 0; - if (argct != 1) {cerr = 3; goto cmderr;} - if (!solvearg(1)) goto cmderr; - if (argt[1] != 2) {cerr = 2; goto cmderr;} - tab_width = atoi(arg[1]); -} -if (chkCmd(1, "_AUTOCMDHIST")) { - if (inProg) {cerr = 254; goto cmderr;} - cerr = 0; - if (argct != 0) {cerr = 3; goto cmderr;} - autohist = true; - goto noerr; -} -if (chkCmd(1, "_SAVECMDHIST")) { - if (inProg) {cerr = 254; goto cmderr;} - cerr = 0; - if (argct > 1) {cerr = 3; goto cmderr;} - if (argct) { + if (chkCmd(1, "_TITLE")) { + if (inProg) {cerr = 254; goto cmderr;} + cerr = 0; + if (argct != 1) {cerr = 3; goto cmderr;} if (!solvearg(1)) goto cmderr; if (argt[1] != 1) {cerr = 2; goto cmderr;} - write_history(arg[1]); - } else { - char* tmpcwd = getcwd(NULL, 0); - int ret = chdir(gethome()); - write_history(HIST_FILE); - #ifdef _WIN32 - SetFileAttributesA(HIST_FILE, FILE_ATTRIBUTE_HIDDEN); + #ifndef _WIN_NO_VT + if (!changedtitle) { + fputs("\e[22;0t", stdout); + fflush(stdout); + changedtitle = true; + } + changedtitlecmd = true; + printf("\e]2;%s%c", arg[1], 7); + #else + SetConsoleTitleA(arg[1]); #endif - ret = chdir(tmpcwd); - (void)ret; + goto noerr; } - goto noerr; -} -if (chkCmd(1, "_LOADCMDHIST")) { - if (inProg) {cerr = 254; goto cmderr;} - cerr = 0; - if (argct > 1) {cerr = 3; goto cmderr;} - clear_history(); - if (argct) { + if (chkCmd(1, "_PROMPT")) { + if (inProg) {cerr = 254; goto cmderr;} + cerr = 0; + if (argct != 1) {cerr = 3; goto cmderr;} if (!solvearg(1)) goto cmderr; if (argt[1] != 1) {cerr = 2; goto cmderr;} - read_history(arg[1]); - } else { - char* tmpcwd = getcwd(NULL, 0); - int ret = chdir(gethome()); - read_history(".clibasic_history"); - ret = chdir(tmpcwd); - (void)ret; + copyStr(tmpargs[1], prompt); + goto noerr; } - goto noerr; -} -if (chkCmd(1, "_TXTLOCK")) { - if (argct) {cerr = 3; goto cmderr;} - cerr = 0; - #ifndef _WIN32 - if (!textlock) { - tcgetattr(0, &term); - tcgetattr(0, &restore); - term.c_lflag &= ~(ICANON|ECHO); - tcsetattr(0, TCSANOW, &term); + if (chkCmd(1, "_PROMPTTAB")) { + if (inProg) {cerr = 254; goto cmderr;} + cerr = 0; + if (argct != 1) {cerr = 3; goto cmderr;} + if (!solvearg(1)) goto cmderr; + if (argt[1] != 2) {cerr = 2; goto cmderr;} + tab_width = atoi(arg[1]); } - #endif - textlock = true; - goto noerr; -} -if (chkCmd(1, "_TXTUNLOCK")) { - if (argct) {cerr = 3; goto cmderr;} - cerr = 0; - #ifndef _WIN32 - if (textlock) tcsetattr(0, TCSANOW, &restore); - #endif - textlock = false; - goto noerr; -} -if (chkCmd(1, "_TXTATTRIB")) { - if (argct < 1 || argct > 2) {cerr = 3; goto cmderr;} - cerr = 0; - if (!solvearg(1)) goto cmderr; - if (argt[1] == 0) {cerr = 3; goto cmderr;} - int attrib = 0; - if (argt[1] == 1) { - for (int32_t i = 0; arg[1][i]; i++) { - if (arg[1][i] >= 'a' && arg[1][i] <= 'z') arg[1][i] -= 32; - if (arg[1][i] == ' ') arg[1][i] = '_'; + if (chkCmd(1, "_AUTOCMDHIST")) { + if (inProg) {cerr = 254; goto cmderr;} + cerr = 0; + if (argct != 0) {cerr = 3; goto cmderr;} + autohist = true; + goto noerr; + } + if (chkCmd(1, "_SAVECMDHIST")) { + if (inProg) {cerr = 254; goto cmderr;} + cerr = 0; + if (argct > 1) {cerr = 3; goto cmderr;} + if (argct) { + if (!solvearg(1)) goto cmderr; + if (argt[1] != 1) {cerr = 2; goto cmderr;} + write_history(arg[1]); + } else { + char* tmpcwd = getcwd(NULL, 0); + int ret = chdir(gethome()); + write_history(HIST_FILE); + #ifdef _WIN32 + SetFileAttributesA(HIST_FILE, FILE_ATTRIBUTE_HIDDEN); + #endif + ret = chdir(tmpcwd); + (void)ret; } - if (!strcmp(arg[1], "RESET")) attrib = 0; else - if (!strcmp(arg[1], "BOLD")) attrib = 1; else - if (!strcmp(arg[1], "ITALIC")) attrib = 2; else - if (!strcmp(arg[1], "UNDERLINE")) attrib = 3; else - if (!strcmp(arg[1], "DBL_UNDERLINE") || !strcmp(arg[1], "DOUBLE_UNDERLINE")) attrib = 4; else - if (!strcmp(arg[1], "SQG_UNDERLINE") || !strcmp(arg[1], "SQUIGGLY_UNDERLINE")) attrib = 5; else - if (!strcmp(arg[1], "STRIKETROUGH")) attrib = 6; else - if (!strcmp(arg[1], "OVERLINE")) attrib = 7; else - if (!strcmp(arg[1], "DIM")) attrib = 8; else - if (!strcmp(arg[1], "BLINK")) attrib = 9; else - if (!strcmp(arg[1], "HIDDEN")) attrib = 10; else - if (!strcmp(arg[1], "REVERSE")) attrib = 11; else - if (!strcmp(arg[1], "UNDERLINE_COLOR")) attrib = 12; else - if (!strcmp(arg[1], "FGC")) attrib = 13; else - if (!strcmp(arg[1], "BGC")) attrib = 14; else - {cerr = 16; goto cmderr;} - } else { - attrib = atoi(arg[1]); - if (attrib < 0 || attrib > 12) {cerr = 16; goto cmderr;} + goto noerr; } - int val = 0; - if (attrib == 0) { - if (argct == 2) {cerr = 3; goto cmderr;} - txt_bold = false; - txt_italic = false; - txt_underln = false; - txt_underlndbl = false; - txt_underlnsqg = false; - txt_strike = false; - txt_overln = false; - txt_dim = false; - txt_blink = false; - txt_hidden = false; - txt_reverse = false; - txt_fgc = true; - txt_bgc = false; - txt_underlncolor = 0; - goto cmderr; - } else if (argct != 2) { - if (attrib == 12) {cerr = 16; goto cmderr;} - val = 1; - } else { - if (!solvearg(2)) goto cmderr; - if (attrib == 12) { - if (argt[2] != 2) {cerr = 2; goto cmderr;} - val = atoi(arg[2]); - if (val < 0 || val > 255) {cerr = 16; goto cmderr;} + if (chkCmd(1, "_LOADCMDHIST")) { + if (inProg) {cerr = 254; goto cmderr;} + cerr = 0; + if (argct > 1) {cerr = 3; goto cmderr;} + clear_history(); + if (argct) { + if (!solvearg(1)) goto cmderr; + if (argt[1] != 1) {cerr = 2; goto cmderr;} + read_history(arg[1]); } else { + char* tmpcwd = getcwd(NULL, 0); + int ret = chdir(gethome()); + read_history(".clibasic_history"); + ret = chdir(tmpcwd); + (void)ret; + } + goto noerr; + } + if (chkCmd(1, "_TXTLOCK")) { + if (argct) {cerr = 3; goto cmderr;} + cerr = 0; + #ifndef _WIN32 + if (!textlock) { + tcgetattr(0, &term); + tcgetattr(0, &restore); + term.c_lflag &= ~(ICANON|ECHO); + tcsetattr(0, TCSANOW, &term); + } + #endif + textlock = true; + goto noerr; + } + if (chkCmd(1, "_TXTUNLOCK")) { + if (argct) {cerr = 3; goto cmderr;} + cerr = 0; + #ifndef _WIN32 + if (textlock) tcsetattr(0, TCSANOW, &restore); + #endif + textlock = false; + goto noerr; + } + if (chkCmd(1, "_TXTATTRIB")) { + if (argct < 1 || argct > 2) {cerr = 3; goto cmderr;} + cerr = 0; + if (!solvearg(1)) goto cmderr; + if (argt[1] == 0) {cerr = 3; goto cmderr;} + int attrib = 0; + if (argt[1] == 1) { + for (int32_t i = 0; arg[1][i]; i++) { + if (arg[1][i] >= 'a' && arg[1][i] <= 'z') arg[1][i] -= 32; + if (arg[1][i] == ' ') arg[1][i] = '_'; + } + if (!strcmp(arg[1], "RESET")) attrib = 0; else + if (!strcmp(arg[1], "BOLD")) attrib = 1; else + if (!strcmp(arg[1], "ITALIC")) attrib = 2; else + if (!strcmp(arg[1], "UNDERLINE")) attrib = 3; else + if (!strcmp(arg[1], "DBL_UNDERLINE") || !strcmp(arg[1], "DOUBLE_UNDERLINE")) attrib = 4; else + if (!strcmp(arg[1], "SQG_UNDERLINE") || !strcmp(arg[1], "SQUIGGLY_UNDERLINE")) attrib = 5; else + if (!strcmp(arg[1], "STRIKETROUGH")) attrib = 6; else + if (!strcmp(arg[1], "OVERLINE")) attrib = 7; else + if (!strcmp(arg[1], "DIM")) attrib = 8; else + if (!strcmp(arg[1], "BLINK")) attrib = 9; else + if (!strcmp(arg[1], "HIDDEN")) attrib = 10; else + if (!strcmp(arg[1], "REVERSE")) attrib = 11; else + if (!strcmp(arg[1], "UNDERLINE_COLOR")) attrib = 12; else + if (!strcmp(arg[1], "FGC")) attrib = 13; else + if (!strcmp(arg[1], "BGC")) attrib = 14; else + {cerr = 16; goto cmderr;} + } else { + attrib = atoi(arg[1]); + if (attrib < 0 || attrib > 12) {cerr = 16; goto cmderr;} + } + int val = 0; + if (attrib == 0) { + if (argct == 2) {cerr = 3; goto cmderr;} + txt_bold = false; + txt_italic = false; + txt_underln = false; + txt_underlndbl = false; + txt_underlnsqg = false; + txt_strike = false; + txt_overln = false; + txt_dim = false; + txt_blink = false; + txt_hidden = false; + txt_reverse = false; + txt_fgc = true; + txt_bgc = false; + txt_underlncolor = 0; + goto cmderr; + } else if (argct != 2) { + if (attrib == 12) {cerr = 16; goto cmderr;} + val = 1; + } else { + if (!solvearg(2)) goto cmderr; + if (attrib == 12) { + if (argt[2] != 2) {cerr = 2; goto cmderr;} + val = atoi(arg[2]); + if (val < 0 || val > 255) {cerr = 16; goto cmderr;} + } else { + if (argt[2] == 0) {cerr = 3; goto cmderr;} + if (argt[2] == 1) { + upCase(arg[2]); + if (!strcmp(arg[2], "ON") || !strcmp(arg[2], "TRUE") || !strcmp(arg[2], "YES")) val = 1; else + if (!strcmp(arg[2], "OFF") || !strcmp(arg[2], "FALSE") || !strcmp(arg[2], "NO")) val = 0; else + {cerr = 16; goto cmderr;} + } else { + sscanf(arg[2], "%d", &val); + if (val < 0 || val > 1) {cerr = 16; goto cmderr;} + } + } + } + switch (attrib) { + case 1: txt_bold = (bool)val; break; + case 2: txt_italic = (bool)val; break; + case 3: txt_underln = (bool)val; break; + case 4: txt_underlndbl = (bool)val; break; + case 5: txt_underlnsqg = (bool)val; break; + case 6: txt_strike = (bool)val; break; + case 7: txt_overln = (bool)val; break; + case 8: txt_dim = (bool)val; break; + case 9: txt_hidden = (bool)val; break; + case 11: txt_reverse = (bool)val; break; + case 12: txt_underlncolor = val; break; + case 13: txt_fgc = (bool)val; break; + case 14: txt_bgc = (bool)val; break; + } + updateTxtAttrib(); + goto noerr; + } + if (chkCmd(1, "_SHATTRIB")) { + if (argct < 1 || argct > 2) {cerr = 3; goto cmderr;} + cerr = 0; + if (!solvearg(1)) goto cmderr; + if (argt[1] == 0) {cerr = 3; goto cmderr;} + int attrib = 0; + if (argt[1] == 1) { + for (int32_t i = 0; arg[1][i]; i++) { + if (arg[1][i] >= 'a' && arg[1][i] <= 'z') arg[1][i] -= 32; + if (arg[1][i] == ' ') arg[1][i] = '_'; + } + if (!strcmp(arg[1], "RESET")) attrib = 0; else + if (!strcmp(arg[1], "SILENT")) attrib = 1; else + if (!strcmp(arg[1], "CLEARATTRIB")) attrib = 2; else + if (!strcmp(arg[1], "RESTOREATTRIB")) attrib = 3; else + {cerr = 16; goto cmderr;} + } else { + attrib = atoi(arg[1]); + if (attrib < 0 || attrib > 12) {cerr = 16; goto cmderr;} + } + int val = 0; + if (attrib == 0) { + if (argct == 2) {cerr = 3; goto cmderr;} + sh_silent = false; + sh_clearAttrib = true; + sh_restoreAttrib = true; + goto cmderr; + } else if (argct != 2) { + if (attrib == 12) {cerr = 16; goto cmderr;} + val = 1; + } else { + if (!solvearg(2)) goto cmderr; if (argt[2] == 0) {cerr = 3; goto cmderr;} if (argt[2] == 1) { upCase(arg[2]); @@ -498,73 +561,12 @@ if (chkCmd(1, "_TXTATTRIB")) { if (val < 0 || val > 1) {cerr = 16; goto cmderr;} } } - } - switch (attrib) { - case 1: txt_bold = (bool)val; break; - case 2: txt_italic = (bool)val; break; - case 3: txt_underln = (bool)val; break; - case 4: txt_underlndbl = (bool)val; break; - case 5: txt_underlnsqg = (bool)val; break; - case 6: txt_strike = (bool)val; break; - case 7: txt_overln = (bool)val; break; - case 8: txt_dim = (bool)val; break; - case 9: txt_hidden = (bool)val; break; - case 11: txt_reverse = (bool)val; break; - case 12: txt_underlncolor = val; break; - case 13: txt_fgc = (bool)val; break; - case 14: txt_bgc = (bool)val; break; - } - updateTxtAttrib(); - goto noerr; -} -if (chkCmd(1, "_SHATTRIB")) { - if (argct < 1 || argct > 2) {cerr = 3; goto cmderr;} - cerr = 0; - if (!solvearg(1)) goto cmderr; - if (argt[1] == 0) {cerr = 3; goto cmderr;} - int attrib = 0; - if (argt[1] == 1) { - for (int32_t i = 0; arg[1][i]; i++) { - if (arg[1][i] >= 'a' && arg[1][i] <= 'z') arg[1][i] -= 32; - if (arg[1][i] == ' ') arg[1][i] = '_'; - } - if (!strcmp(arg[1], "RESET")) attrib = 0; else - if (!strcmp(arg[1], "SILENT")) attrib = 1; else - if (!strcmp(arg[1], "CLEARATTRIB")) attrib = 2; else - if (!strcmp(arg[1], "RESTOREATTRIB")) attrib = 3; else - {cerr = 16; goto cmderr;} - } else { - attrib = atoi(arg[1]); - if (attrib < 0 || attrib > 12) {cerr = 16; goto cmderr;} - } - int val = 0; - if (attrib == 0) { - if (argct == 2) {cerr = 3; goto cmderr;} - sh_silent = false; - sh_clearAttrib = true; - sh_restoreAttrib = true; - goto cmderr; - } else if (argct != 2) { - if (attrib == 12) {cerr = 16; goto cmderr;} - val = 1; - } else { - if (!solvearg(2)) goto cmderr; - if (argt[2] == 0) {cerr = 3; goto cmderr;} - if (argt[2] == 1) { - upCase(arg[2]); - if (!strcmp(arg[2], "ON") || !strcmp(arg[2], "TRUE") || !strcmp(arg[2], "YES")) val = 1; else - if (!strcmp(arg[2], "OFF") || !strcmp(arg[2], "FALSE") || !strcmp(arg[2], "NO")) val = 0; else - {cerr = 16; goto cmderr;} - } else { - sscanf(arg[2], "%d", &val); - if (val < 0 || val > 1) {cerr = 16; goto cmderr;} + switch (attrib) { + case 1: sh_silent = (bool)val; break; + case 2: sh_clearAttrib = (bool)val; break; + case 3: sh_restoreAttrib = (bool)val; break; } + updateTxtAttrib(); + goto noerr; } - switch (attrib) { - case 1: sh_silent = (bool)val; break; - case 2: sh_clearAttrib = (bool)val; break; - case 3: sh_restoreAttrib = (bool)val; break; - } - updateTxtAttrib(); - goto noerr; }