/* A program to convert IBM mainframe EBDIC text files to ASCII Andrew D. Todd Aug 10, 1998 ------------------------------------------------------------ syntax: EBDTOASC src dst where src, dst are filespecs ---------------------------------------------------------------- environment: MS-DOS, using MIX Power C compiler (superset of Microsoft C, Borland Turbo C), however, should be extremely portable. ----------------------------------------------------------------- This program is in the public domain, and may be used for any purpose whatsover, without permission or notification, but is offered "as-is" without any warrentee, express or implied. ----------------------------------------------------------------- Andrew D. Todd 1249 Pineview Dr., Apt 4 Morgantown, WV 26505 U46A8@WVNVM.WVNET.EDU */ #include #include #include #include #include main(int argc, char *argv[]) { int space_cnt, status, f_in, f_out; char c, c1, c2, c1c, c2c; char *hex_rep = "\r\n[xx]\r\n"; if( argc < 3 ) { printf(" \nBoth Source and Destination Files Needed\n"); _exit(3); } f_in = open(argv[1], O_RDONLY|O_BINARY); if(f_in == -1) { printf(" \n%s Does Not Exist\n", argv[1]); _exit(4); } f_out = open(argv[2], O_WRONLY|O_CREAT|O_EXCL|O_BINARY, S_IREAD|S_IWRITE); if( f_out == -1) { printf(" \nDestination File %s Invalid\n", argv[2]); _exit(5); } for(;;) /* Do for the whole file */ { status = read(f_in, &c, 1); if(status != 1) break; else if( conversion_available(c, f_out) ); /*puts that out*/ else { c2=c%16; c1=(c-c2)/16; if(c1 <= 9) c1c = c1 + '0'; else c1c = c1 + 'A'-10; if(c2 <= 9) c2c = c2 + '0'; else c2c = c2 + 'A'-10; hex_rep[3] = c1c; hex_rep[4] =c2c; write(f_out, hex_rep, 8); } } close(f_in); close(f_out); _exit(0); } /*----------------------------------------------------*/ conversion_available(char c, int f_out) { char c_o; int return_code; return_code = 1; if( test_range(c, &c_o, '\x81', '\x89', 'a') || test_range(c, &c_o, '\x91', '\x99', 'j') || test_range(c, &c_o, '\xa2', '\xa9', 's') || test_range(c, &c_o, '\xc1', '\xc9', 'A') || test_range(c, &c_o, '\xd1', '\xd9', 'J') || test_range(c, &c_o, '\xe2', '\xe9', 'S') || test_range(c, &c_o, '\xf0', '\xf9', '0') ) write(f_out, &c_o, 1); else if( test_special_chars(c, &c_o) ) write(f_out, &c_o, 1); else return_code = 0; /*always*/ return(return_code); } /*-------------------------------------------------*/ test_special_chars(char c, char *c_o) { int c_found; c_found = 0; switch(c) { case '\x40': *c_o = ' '; c_found = 1; break; /*cent*/ case '\x4a': *c_o = 'c'; c_found = 1; break; /*cent*/ case '\x4b': *c_o = '.'; c_found = 1; break; case '\x4c': *c_o = '<'; c_found = 1; break; case '\x4d': *c_o = '('; c_found = 1; break; case '\x4e': *c_o = '+'; c_found = 1; break; case '\x4f': *c_o = '|'; c_found = 1; break; case '\x50': *c_o = '&'; c_found = 1; break; case '\x5a': *c_o = '!'; c_found = 1; break; case '\x5b': *c_o = '$'; c_found = 1; break; case '\x5c': *c_o = '*'; c_found = 1; break; case '\x5d': *c_o = ')'; c_found = 1; break; case '\x5e': *c_o = ';'; c_found = 1; break; case '\x5f': *c_o = '~'; c_found = 1; break; /*EBDIC not mark*/ case '\x60': *c_o = '-'; c_found = 1; break; case '\x61': *c_o = '/'; c_found = 1; break; case '\x6a': *c_o = '|'; c_found = 1; break; case '\x6b': *c_o = ','; c_found = 1; break; case '\x6c': *c_o = '%'; c_found = 1; break; case '\x6d': *c_o = '_'; c_found = 1; break; case '\x6e': *c_o = '>'; c_found = 1; break; case '\x6f': *c_o = '?'; c_found = 1; break; case '\x7a': *c_o = ':'; c_found = 1; break; case '\x7b': *c_o = '#'; c_found = 1; break; case '\x7c': *c_o = '@'; c_found = 1; break; case '\x7d': *c_o = '\x27'; c_found = 1; break; /*apostrophe*/ case '\x7e': *c_o = '='; c_found = 1; break; case '\x7f': *c_o = '\x22'; c_found = 1; break; /*quote mark*/ case '\xa1': *c_o = '~'; c_found = 1; break; case '\xad': *c_o = '['; c_found = 1; break; case '\xbd': *c_o = ']'; c_found = 1; break; case '\xc0': *c_o = '{'; c_found = 1; break; case '\xcc': *c_o = 'S'; c_found = 1; break; /* integral */ case '\xce': *c_o = 'Y'; c_found = 1; break; /*what?*/ case '\xd0': *c_o = '}'; c_found = 1; break; case '\xe0': *c_o = '\\'; c_found = 1; break; case '\xec': *c_o = 'h'; c_found = 1; break; /*what ?*/ case '\xfa': *c_o = '|'; c_found = 1; break; default: c_found = 0; } return(c_found); } /*----------------------------------------------------------------*/ test_range( char c, char *c_o, char l_bound, char u_bound, char start_trans ) { if( ( c >= l_bound) && ( c <= u_bound) ) { *c_o= c + start_trans - l_bound; return(1); } else return(0); }