static void hex(const char *s) { unsigned long long i = 0; switch (s[0]) { case 'b': case 'B': i = read_bin(s + 1); break; case 'x': case 'X': i = read_hex(s + 1); break; case '0': if (s[1] == '\0') i = read_dec(s); else if (s[1] == 'x' || s[1] == 'X') i = read_hex(s + 2); else i = read_oct(s + 1); break; default: if (isdigit(*s)) i = read_dec(s); else usage(); break; } print_bin(i); print_chr(i); print_dec(i); print_hex(i); print_oct(i); }
int print_number(int fd, va_list ap, char c) { int written = 0; switch (c) { case 's': written = print_str(fd, va_arg(ap, char *)); break; case 'd': written = print_dec(fd, va_arg(ap, uint64_t)); break; case 'o': written = print_oct(fd, va_arg(ap, uint64_t)); break; case 'x': written = print_hex(fd, va_arg(ap, uint64_t)); break; case 'c': written = print_chr(fd, va_arg(ap, uint64_t)); break; default: fputc(fd, c); written++; } return written; }
static int builtin_echo_ext(const char *msg) { int backed = 0; for (; *msg; ++msg) if (*msg == '\\' && !backed && (backed = 1)) continue; else if (backed && *msg == 'a' && !(backed = 0)) putchar('\a'); else if (backed && *msg == 'b' && !(backed = 0)) putchar('\b'); else if (backed && *msg == 'c') return 0; else if (backed && *msg == 'e' && !(backed = 0)) putchar(0x1b); else if (backed && *msg == 'f' && !(backed = 0)) putchar('\f'); else if (backed && *msg == 'n' && !(backed = 0)) putchar('\n'); else if (backed && *msg == 'r' && !(backed = 0)) putchar('\r'); else if (backed && *msg == 't' && !(backed = 0)) putchar('\t'); else if (backed && *msg == '\\' && !(backed = 0)) putchar('\\'); else if (backed && *msg == 'v' && !(backed = 0)) putchar('\v'); else if (backed && fisdigit(*msg) && !(backed = 0)) print_oct(&msg); else if (backed && *msg == 'x' && !(backed = 0) && (++msg)) print_hex(&msg); else if (backed && !(backed = 0)) printf("\\%c", *msg); else putchar(*msg); return 1; }