LPCSTR strcmp_m (LPCSTR pszWhere, LPCSTR pszWhat) { if (*pszWhere == 0) return *pszWhat == 0 ? pszWhere : NULL; if (*pszWhat == 0) return NULL; if (*pszWhat == '*') { if (pszWhat [1] == 0) return pszWhere; LPCSTR psz = strcmp_m (pszWhere, pszWhat+1); if (psz) return psz; return strcmp_m (pszWhere+1, pszWhat); } if (*pszWhat != '?') { if (*pszWhere != *pszWhat) return NULL; } return strcmp_m (pszWhere+1, pszWhat+1) ? pszWhere : NULL; }
/** * moecc * [-v | --version] * [-f | -i | --input file1.moe file2.cc file3.mc file4.moec ..] * [-o | --output out.c] */ int main(int argc, char *argv[]) { int i; main_arg_state state = MainArgStateDefault; char *input = 0; char *output = 0; if (argc == 1) { printf("%s\n", "moecc [-v] [-f file.moe] [-o out.c] | man moecc"); return 0; } for (i = 1; i < argc; i++) { if (strcmp_m(argv[i], 2, "-v", "--version")) { printf("%s%s\n", "moecc version :: c-", GIT_REVISION); return 0; } else if (strcmp_m(argv[i], 3, "-f", "-i", "--input")) { state = MainArgStateInput; } else if (strcmp_m(argv[i], 2, "-o", "--output")) { state = MainArgStateOutput; } else { if (state == MainArgStateInput) { if (input == 0) { input = argv[i]; } else { printf("%s\n", "error :: more than one input"); } } else if (state == MainArgStateOutput) { if (output == 0) { output = argv[i]; } else { printf("%s\n", "error :: more than one output"); } } else { printf("%s%s\n", "error :: invalid arg -> ", argv[i]); return 0; } } } if (!input || !output) { printf("%s\n", "error :: missing input or output file"); return 0; } else { /** * safe to compile */ printf("compiling %s to %s... ", input, output); printf("%s\n", "done ~ bye!"); } return 0; }
LPCSTR strcmpi_m (LPCSTR pszWhere, LPCSTR pszWhat) { char *psz1 = new char [lstrlen (pszWhere) + 1]; char *psz2 = new char [lstrlen (pszWhat) + 1]; lstrcpy (psz1, pszWhere); lstrcpy (psz2, pszWhat); CharLower (psz1); CharLower (psz2); LPCSTR psz = strcmp_m (psz1, psz2); LPCSTR pszRet = NULL; if (psz) pszRet = pszWhere + (psz - psz1); delete [] psz1; delete [] psz2; return pszRet; }