int main() { printf("convert hex to bin\nmau berapa digit?"); int n; scanf("%d", &n); char hex[n], bin[n*4]; scanf("%s", &hex); octtobin(n, hex, bin); printf("%s\n", bin); return 0; }
/* * Print SysV echo(1) style escape string * Halts processing string if a \c escape is encountered. */ static char * conv_escape_str(char *str) { int ch; char *cp; /* convert string into a temporary buffer... */ STARTSTACKSTR(cp); do { int c; ch = *str++; if (ch != '\\') continue; ch = *str++; if (ch == 'c') { /* \c as in SYSV echo - abort all processing.... */ rval |= 0x100; ch = 0; continue; } /* * %b string octal constants are not like those in C. * They start with a \0, and are followed by 0, 1, 2, * or 3 octal digits. */ if (ch == '0') { unsigned char i; i = 3; ch = 0; do { unsigned k = octtobin(*str); if (k > 7) break; str++; ch <<= 3; ch += k; } while (--i); continue; } /* Finally test for sequences valid in the format string */ str = conv_escape(str - 1, &c); ch = c; } while (STPUTC(ch, cp), ch); return stackblock(); }
/* * Print "standard" escape characters */ static char * conv_escape(char *str, int *conv_ch) { int value; int ch; ch = *str; switch (ch) { default: case 0: value = '\\'; goto out; case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': ch = 3; value = 0; do { value <<= 3; value += octtobin(*str++); } while (isodigit(*str) && --ch); goto out; case '\\': value = '\\'; break; /* backslash */ case 'a': value = '\a'; break; /* alert */ case 'b': value = '\b'; break; /* backspace */ case 'f': value = '\f'; break; /* form-feed */ case 'n': value = '\n'; break; /* newline */ case 'r': value = '\r'; break; /* carriage-return */ case 't': value = '\t'; break; /* tab */ case 'v': value = '\v'; break; /* vertical-tab */ } str++; out: *conv_ch = value; return str; }
/* * Print SysV echo(1) style escape string * Halts processing string and returns 1 if a \c escape is encountered. */ static int print_escape_str(const char *str) { int value; int c; while (*str) { if (*str == '\\') { str++; /* * %b string octal constants are not like those in C. * They start with a \0, and are followed by 0, 1, 2, * or 3 octal digits. */ if (*str == '0') { str++; for (c = 3, value = 0; c-- && isodigit(*str); str++) { value <<= 3; value += octtobin(*str); } putchar (value); str--; } else if (*str == 'c') { return 1; } else { str--; str += print_escape(str); } } else { putchar (*str); } str++; } return 0; }
/* * Print "standard" escape characters */ static int print_escape(const char *str) { const char *start = str; int value; int c; str++; switch (*str) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': for (c = 3, value = 0; c-- && isodigit(*str); str++) { value <<= 3; value += octtobin(*str); } putchar(value); return str - start - 1; /* NOTREACHED */ case 'x': str++; for (value = 0; isxdigit(*str); str++) { value <<= 4; value += hextobin(*str); } if (value > UCHAR_MAX) { warnx ("escape sequence out of range for character"); rval = 1; } putchar (value); return str - start - 1; /* NOTREACHED */ case '\\': /* backslash */ putchar('\\'); break; case '\'': /* single quote */ putchar('\''); break; case '"': /* double quote */ putchar('"'); break; case 'a': /* alert */ putchar('\a'); break; case 'b': /* backspace */ putchar('\b'); break; case 'e': /* escape */ #ifdef __GNUC__ putchar('\e'); #else putchar(033); #endif break; case 'f': /* form-feed */ putchar('\f'); break; case 'n': /* newline */ putchar('\n'); break; case 'r': /* carriage-return */ putchar('\r'); break; case 't': /* tab */ putchar('\t'); break; case 'v': /* vertical-tab */ putchar('\v'); break; default: putchar(*str); warnx("unknown escape sequence `\\%c'", *str); rval = 1; } return 1; }