|
CS456 - Systems Programming
| Displaying exercises/e2/solution/ascii.c
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <stdint.h>
#include <sys/types.h>
#include <string.h>
void prints(char *s) {
write(STDOUT_FILENO, s, strlen(s));
}
void printc(char c) {
write(STDOUT_FILENO, &c, 1);
}
void printhex(uint8_t v) {
char *hex = "0123456789ABCDEF";
printc(hex[v>>4]);
printc(hex[v&0x0F]);
}
void printoct(uint8_t o) {
printc((o>>6)+'0');
printc((o>>3 & 07)+'0');
printc((o & 07)+'0');
}
void printdec(uint8_t n) {
char nbuf[4];
if (n < 100) printc(' ');
else printc((n/100)+'0');
if (n < 10) printc(' ');
else printc(((n/10)%10)+'0');
printc((n%10)+'0');
}
void printbin(uint8_t b) {
for(int i=128; i >= 1; i>>=1)
printc((b&i)? '1' : '0');
}
uint8_t chr(uint8_t c)
{
if (c < 32 || (c > 126 && c < 160)) return '.';
else return c;
}
int main(int argc, char **argv)
{
int i, j, col;
uint8_t c;
void (*printx)(uint8_t n) = printdec;
for(i=1; i < argc; i++) {
if (argv[i][0] == '-') {
if (strcmp(argv[i],"--help") == 0) {
prints("usage: ascii [-boh]\n");
prints(" -b\tPrint ascii values in binary.\n");
prints(" -o\tPrint ascii values in octal.\n");
prints(" -h\tPrint ascii values in hexidecimal.\n");
exit(0);
}
for(j=1;argv[i][j];j++) {
switch(argv[i][j]) {
case 'b':
printx = printbin;
break;
case 'o':
printx = printoct;
break;
case 'h':
printx = printhex;
break;
}
}
}
}
for(c=0;c<32;c++) {
for(col = 0; col < 4; col++) {
printc(' ');
printx(c + (col*32));
prints(": '");
printc(chr(c + (col*32)));
printc('\'');
printc(col<3? '\t' : '\n');
}
}
return 0;
}
|