📄 hecx.c
字号:
#include "hexbin.h"#ifdef HECX#include "globals.h"#include "crc.h"#include "readline.h"#include "../util/masks.h"#include "../util/util.h"#include "../fileio/machdr.h"#include "../fileio/wrfile.h"#include "buffer.h"#include "printhdr.h"extern void exit();static void do_o_forks();static long make_file();static void comp_c_crc();static void comp_e_crc();static int comp_to_bin();static int hex_to_bin();static int hexit();static int compressed;/* old format -- process .hex and .hcx files */void hecx(macname, filename)char *macname, *filename;{ int n; for(n = 0; n < INFOBYTES; n++) { info[n] = 0; } compressed = 0; /* set up name for output files */ if(macname[0] == '\0') { /* strip directories */ macname = search_last(filename, '/'); if(macname == NULL) { macname = filename; } else { macname++; } /* strip extension */ n = strlen(macname); if(n > 4) { n -= 4; if(!strncmp(macname + n, ".hex", 4) || !strncmp(macname + n, ".hcx", 4)) { macname[n] = '\0'; } } } n = strlen(macname); if(n > F_NAMELEN) { n = F_NAMELEN; } (void)strncpy(mh.m_name, macname, n); mh.m_name[n] = '\0'; /* "#TYPEAUTH$flag" line already read */ n = strlen(line); if(n >= 6 && line[0] == '#' && line[n-5] == '$') { if(n >= 10) { (void)strncpy(mh.m_type, &line[1], 4); } if(n >= 14) { (void)strncpy(mh.m_author, &line[5], 4); } (void)sscanf(&line[n-4], "%4hx", &mh.m_flags); } transname(mh.m_name, trname, n); define_name(trname); do_o_forks(); if(listmode) { if(!compressed) { (void)fprintf(stderr, "This file is in \"hex\" format.\n"); } else { (void)fprintf(stderr, "This file is in \"hcx\" format.\n"); } } print_header0(0); print_header1(0, 0); info[I_NAMEOFF] = n; (void)strncpy(info + I_NAMEOFF + 1, mh.m_name, n); (void)strncpy(info + I_TYPEOFF, mh.m_type, 4); (void)strncpy(info + I_AUTHOFF, mh.m_author, 4); put2(info + I_FLAGOFF, (unsigned long)mh.m_flags); put4(info + I_DLENOFF, (unsigned long)mh.m_datalen); put4(info + I_RLENOFF, (unsigned long)mh.m_rsrclen); put4(info + I_CTIMOFF, (unsigned long)mh.m_createtime); put4(info + I_MTIMOFF, (unsigned long)mh.m_modifytime); print_header2(0); end_put();}static void do_o_forks(){ int forks = 0, found_crc = 0; unsigned long calc_crc, file_crc; crc = 0; /* calculate a crc for both forks */ set_put(0); set_put(1); while(!found_crc && readline()) { if(line[0] == 0) { continue; } if(forks == 0 && strncmp(line, "***COMPRESSED", 13) == 0) { compressed++; continue; } if(strncmp(line, "***DATA", 7) == 0) { set_put(1); mh.m_datalen = make_file(compressed); forks++; continue; } if(strncmp(line, "***RESOURCE", 11) == 0) { set_put(0); mh.m_rsrclen = make_file(compressed); forks++; continue; } if(compressed && strncmp(line, "***CRC:", 7) == 0) { found_crc++; calc_crc = crc; (void)sscanf(&line[7], "%lx", &file_crc); break; } if(!compressed && strncmp(line, "***CHECKSUM:", 12) == 0) { found_crc++; calc_crc = crc & BYTEMASK; (void)sscanf(&line[12], "%lx", &file_crc); file_crc &= BYTEMASK; break; } } if(found_crc) { verify_crc(calc_crc, file_crc); } else { (void)fprintf(stderr, "missing CRC\n");#ifdef SCAN do_error("hexbin: missing CRC");#endif /* SCAN */ exit(1); }}static long make_file(compressed)int compressed;{ register long nbytes = 0L; while(readline()) { if(line[0] == 0) { continue; } if(strncmp(line, "***END", 6) == 0) { break; } if(compressed) { nbytes += comp_to_bin(); } else { nbytes += hex_to_bin(); } } return nbytes;}static void comp_c_crc(c)unsigned char c;{ crc = (crc + c) & WORDMASK; crc = ((crc << 3) & WORDMASK) | (crc >> 13);}static void comp_e_crc(c)unsigned char c;{ crc += c;}#define SIXB(c) (((c)-0x20) & 0x3f)static int comp_to_bin(){ char obuf[BUFSIZ]; register char *ip = line; register char *op = obuf; register int n, outcount; int numread, incount; numread = strlen(line); outcount = (SIXB(ip[0]) << 2) | (SIXB(ip[1]) >> 4); incount = ((outcount / 3) + 1) * 4; for(n = numread; n < incount; n++) { /* restore lost spaces */ line[n] = ' '; } n = 0; while(n <= outcount) { *op++ = SIXB(ip[0]) << 2 | SIXB(ip[1]) >> 4; *op++ = SIXB(ip[1]) << 4 | SIXB(ip[2]) >> 2; *op++ = SIXB(ip[2]) << 6 | SIXB(ip[3]); ip += 4; n += 3; } for(n = 1; n <= outcount; n++) { comp_c_crc((unsigned)obuf[n]); put_byte(obuf[n]); } return outcount;}static int hex_to_bin(){ register char *ip = line; register int n, outcount; int c; n = strlen(line); outcount = n / 2; for(n = 0; n < outcount; n++) { c = hexit((int)*ip++); comp_e_crc((unsigned)(c = (c << 4) | hexit((int)*ip++))); put_byte((char)c); } return outcount;}static int hexit(c)int c;{ if('0' <= c && c <= '9') { return c - '0'; } if('A' <= c && c <= 'F') { return c - 'A' + 10; } (void)fprintf(stderr, "illegal hex digit: %c", c);#ifdef SCAN do_error("hexbin: illegal hex digit");#endif /* SCAN */ exit(1); /* NOTREACHED */}#else /* HECX */int hecx; /* keep lint and some compilers happy */#endif /* HECX */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -