int cmd_path(char *param) { char *p; /* >>PATH ;<< must remove the string entirely */ if(!param || !*(p = ltrimcl(param)) && !strchr(param, ';')) { p = getEnv(PATHVAR); displayString(p? TEXT_MSG_PATH: TEXT_MSG_PATH_NONE, p); return 0; } rtrimcl(p); /* remove trailing spaces */ return chgEnvRemove(PATHVAR, p); }
int cmd_if(char *param) { #define X_EXEC 1 char *pp; int x_flag = 0; /* when set cause 'then' clause to be exec'ed */ int negate = 0; /* NOT keyword present */ int ignore_case = 0; /* /I option, case insensitive compare */ /* First check if param exists */ assert(param); /* check for options, note non-options must be treated as part of comparision */ if (matchtok(param, "/I")||matchtok(param, "/i")) ignore_case++; /* next check if param string begins with word 'not' */ if(matchtok(param, "not")) negate = X_EXEC; /* Remember 'NOT' */ /* Check for 'exist' form */ if(matchtok(param, "exist")) { struct dos_ffblk f; isr olderrhandler; if(!*param) { /* syntax error */ error_if_exist(); return 0; } pp = skip_word(param); *pp++ = '\0'; /* don't show abort/retry/fail if no disk in drive */ get_isr(0x24, olderrhandler); #ifdef XMS_SWAP set_isrfct(0x24, autofail_err_handler); /* always fails */ #else set_isrfct(0x24, dummy_criter_handler); /* always fails */ #endif if(dos_findfirst(param, &f, FA_NORMAL|FA_ARCH|FA_SYSTEM|FA_RDONLY|FA_HIDDEN) == 0) x_flag = X_EXEC; dos_findclose(&f); /* restore critical error handler */ set_isrfct(0x24, olderrhandler); } /* Check for 'errorlevel' form */ else if(matchtok(param, "errorlevel")) { int n = 0; #if 0 if(!isdigit(*param)) { error_if_errorlevel(); return 0; } pp = param; do n = n * 10 + (*pp - '0'); while (isdigit(*++pp)); if(*pp && !isargdelim(*pp)) { error_if_errorlevel_number(); return 0; } #else /* Add this COMMAND bug as someone tries to use: IF ERRORLEVEL H<upper-case_letter> -or- IF ERRORLEVEL x<lower-case_letter> to match the errorlevel against drive letters. NOT supported by 4dos or WinNT. HA --> maps to errorlevel 1 xa --> same HB & xb --> to 2 a.s.o. */ if(!*param) { error_if_errorlevel(); return 0; } pp = param; do n = n * 10 + (*pp - '0'); while(*++pp && !isargdelim(*pp)); n &= 255; dprintf( ("IF: checking for ERRORLEVEL >= %u\n", n) ); #endif if(errorlevel >= n) x_flag = X_EXEC; } /* Check that '==' is present, syntax error if not */ else { size_t len; char *r; /* right operand */ pp = skipqword(param, "=="); if(*pp != '=' || pp[1] != '=') { error_syntax(0); return 0; } *pp = '\0'; /* param[] points to the left operand */ /* skip over the '==' and subsquent spaces and assign the end of the right operator to pp */ pp = skipqword(r = ltrimcl(pp + 2), 0); /* now: param := beginning of the left operand r := beginning of the right operand pp := end of right operand */ rtrimcl(param); /* ensure that spurious whitespaces are ignored */ len = strlen(param); /* check if strings differ */ if ( ((pp - r) == len) && ((ignore_case && strnicmp(param, r, len) == 0) || (memcmp(param, r, len) == 0)) ) x_flag = X_EXEC; } if(x_flag ^ negate) /* perform the command */ if(!*(pp = ltrimcl(pp))) error_if_command(); else parsecommandline(pp, FALSE); return 0; }
char *trimcl(char *str) { assert(str); rtrimcl(str); return ltrimcl(str); }