Logo  

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;
}