Created
April 18, 2022 12:23
-
-
Save andreubotella/01e77a5ba3021c4a0515999e87fa21a7 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <iostream> | |
#include <wordexp.h> | |
using namespace std; | |
char hexDigit(int digit) { | |
if (digit >= 0 && digit <= 9) { | |
return '0' + digit; | |
} else if (digit >= 10 && digit <= 15) { | |
return 'A' + digit - 10; | |
} else { | |
return '?'; | |
} | |
} | |
void printString(char *str) { | |
std::cout << "\""; | |
for (;; str++) { | |
char c = *str; | |
if (c == '\0') { | |
break; | |
} else if (c == '"') { | |
std::cout << "\\\""; | |
} else if (c == '\n') { | |
std::cout << "\\n"; | |
} else if (c == '\r') { | |
std::cout << "\\r"; | |
} else if (c == '\\') { | |
std::cout << "\\\\"; | |
} else if (c < 0x20) { | |
char hex[3] = {hexDigit(c / 16), hexDigit(c % 16), '\0'}; | |
std::cout << "\\x" << hex; | |
} else { | |
char cstr[2] = {c, '\0'}; | |
std::cout << cstr; | |
} | |
} | |
std::cout << "\""; | |
} | |
int main(int argc, char **argv) { | |
if (argc != 2) { | |
std::cerr << "Argc (" << argc << ") != 2" << std::endl; | |
return -1; | |
} | |
wordexp_t exp; | |
int error = wordexp(argv[1], &exp, 0); | |
if (error != 0) { | |
const char *error_name; | |
if (error == WRDE_BADCHAR) { | |
error_name = "WRDE_BADCHAR"; | |
} else if (error == WRDE_BADVAL) { | |
error_name = "WRDE_BADVAL"; | |
} else if (error == WRDE_CMDSUB) { | |
error_name = "WRDE_CMDSUB"; | |
} else if (error == WRDE_NOSPACE) { | |
error_name = "WRDE_NOSPACE"; | |
} else if (error == WRDE_SYNTAX) { | |
error_name = "WRDE_SYNTAX"; | |
} else { | |
error_name = "?????"; | |
} | |
std::cerr << "wordexp error code " << error << " (" << error_name << ")" | |
<< std::endl; | |
return error; | |
} | |
if (exp.we_offs != 0) { | |
std::cerr << "Unexpected initial offsets." << std::endl; | |
return -1; | |
} | |
std::cout << "["; | |
for (size_t i = 0; i < exp.we_wordc; i++) { | |
if (i != 0) { | |
std::cout << ", "; | |
} | |
printString(exp.we_wordv[i]); | |
} | |
std::cout << "]" << std::endl; | |
wordfree(&exp); | |
return 0; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment