📄 keywhash.c
字号:
/* $Header: keywhash.c,v 2.17 03/08/12 14:55:13 evert Exp $ *//* * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands. * See the copyright notice in the ACK home directory, in the file "Copyright". *//* @(#)keywhash.c 1.6 *//* * Micro processor assembler framework written by * Johan Stevenson, Vrije Universiteit, Amsterdam * modified by * Johan Stevenson, Han Schaminee and Hans de Vries * Philips S&I, T&M, PMDS, Eindhoven#include "comm0.h"#include "comm1.h" */#include <stdio.h> FILE *inptr, *uitptr; char includfil[] = "#include", includnam[100];char *bigdarr[] = { "ALIGN", "ASCII", "ASCIZ", "ASSERT", "BASE", "BYTE", "BSS","COMM", "DATA", "DEFINE", "EXTERN", "FILE", "LINE", "LIST", "LONG", "NOLIST","SECT", "SPACE", "SYMB", "SYMD", "TEXT", "WORD", ""};char *bigaarr[] = { "AAA", "AAD", "AAM", "AAS", "ADC", "ADCB", "ADD", "ADDB","AH", "AL", "AND", "ANDB", "AX", "BH", "BL", "BP", "BX", "CALL", "CALLF", "CBW","CH", "CL", "CLC", "CLD", "CLI", "CMC", "CMP", "CMPB", "CMPS", "CMPSB", "CMPSW","CS", "CSEG", "CWD", "CX", "DAA", "DAS", "DEC", "DECB", "DH", "DI", "DIV","DIVB", "DL", "DS", "DSEG", "DX", "ES", "ESC", "ESEG", "HLT", "IDIV", "IDIVB","IMUL", "IMULB", "IN", "INB", "INC", "INCB", "INT", "INTO", "INW", "IRET", "JA","JAE", "JB", "JBE", "JC", "JCXZ", "JE", "JG", "JGE", "JL", "JLE", "JMP", "JMPF","JNA", "JNAE", "JNB", "JNBE", "JNC", "JNE", "JNG", "JNGE", "JNL", "JNLE", "JNO","JNP", "JNS", "JNZ", "JO", "JP", "JPE", "JPO", "JS", "JZ", "LAHF", "LDS", "LEA","LES", "LOCK", "LODS", "LODSB", "LODSW", "LOOP", "LOOPE", "LOOPNE", "LOOPNZ","LOOPZ", "MOV", "MOVB", "MOVS", "MOVSB", "MOVSW", "MOVW", "MUL", "MULB", "NEG","NEGB", "NOP", "NOT", "NOTB", "OR", "ORB", "OUT", "OUTB", "OUTW", "POP", "POPF","PUSH", "PUSHF", "RCL", "RCLB", "RCR", "RCRB", "REP", "REPE", "REPNE", "REPNZ","REPZ", "RET", "RETF", "ROL", "ROLB", "ROR", "RORB", "SAHF", "SAL", "SALB","SAR", "SARB", "SBB", "SBBB", "SCAS", "SCASB", "SCASW", "SHL", "SHLB", "SHR","SHRB", "SI", "SP", "SS", "SSEG", "STC", "STD", "STI", "STOS", "STOSB", "STOSW","SUB", "SUBB", "SYS", "TEST", "TESTB", "WAIT", "XCHG", "XCHGB", "XLAT", "XOR","XORB", ""};int teld, tela, ltaba[200], ltabd[25], tabnr, nxtabd[25], nxtaba[200];int htabd[33], htaba[33];char chdarr[128], chaarr[1024], tokenc[10], regel[256], *tptr, aord, *sptr;int maaktoken(m,n) int m,n; { int len,hsh,i,j; char *p,c,t; len = hsh = 0; if(m) p = bigaarr[n]; else p = bigdarr[n]; while(*p) { len++; hsh += *p++;} hsh &= 0x17; if(m) {nxtaba[n] = htaba[hsh]; htaba[hsh] = n; ltaba[n] = len;} else {nxtabd[n] = htabd[hsh]; htabd[hsh] = n; ltabd[n] = len;}}int getregel() { int i,c; i = 0; while ((c=getc(inptr)) != '\n') {if (c==EOF) return(-1); if(c=='\r'){c = getc(inptr); if(c=='\n') ungetc(c,inptr); else break;} else { regel[i++] = (char)(c&255); if(i>250){fprintf(stderr,"Buffer too small. Line truncated.\n"); break;}} } regel[i++] = '\0'; regel[i++] = '\0'; regel[i] = '\0'; /*fprintf(stderr,"%s\n",regel);*/ return(i-1);}int zoektoken(){ int len, hsh, n; char t,*dptr, *tt, bk; t = '?'; len = hsh = n = 0; tt=tokenc; if(*tptr == '\0') return(-1); bk = *tptr; if((bk == '\0') || (bk == '!') || (bk == '"')) return(-1); while (bk=t, t = *tptr++){ /*fprintf(stderr," -%c-%c- %s\n",bk,t,(tptr-1));*/ if((bk == '\0') || (bk == '!') || (bk == '"')) return(-1); if(t=='.' && *tptr>='a' && *tptr <= 'z') { /* search the d-tables */ sptr = dptr = tptr; t= *dptr++; len++; hsh = t; *tt++ = t; t = *dptr++; while((t >'@') && (t<= 'Z')) {len++; hsh += t; *tt++ = t; t = *dptr++;} hsh &= 0x17; n = htabd[hsh]; while(n>=0){ if((len == ltabd[n]) && (!strncmp(bigdarr[n],tokenc,len))) return(len); n = nxtabd[n]; } return(0); } if(t>'@' && t<='Z') { /* search the a-tables */ dptr = sptr = tptr; sptr--; len++; hsh = t; *tt++ = t; t = *dptr++; while((t >'@') && (t<= 'Z')) {len++; hsh += t; *tt++ = t; t = *dptr++;} hsh &= 0x17; n = htaba[hsh]; while(n>=0){ if((len == ltaba[n]) && (!strncmp(bigaarr[n],tokenc,len))) return(len); n = nxtaba[n]; } tptr = dptr-1; return(0); } } return(-1);}hashh(){ int i,j,k,l; for(i=0;i<33;i++) htaba[i] = htabd[i] = -1; i=0; while(bigdarr[i][0]){maaktoken(0,i); i++;} teld = i; /*for(i=0;i<32;i++){fprintf(stderr,"i %d\t",i); j = htabd[i]; while(j>=0) {fprintf(stderr,"%3d j %6s ",j,bigdarr[j]); j=nxtabd[j];} putc('\n',stderr);} putc('\n',stderr);*/ i=0; while(bigaarr[i][0]){maaktoken(1,i); i++;} tela = i; /*for(i=0;i<32;i++){fprintf(stderr,"i %d\t",i); j = htaba[i]; while(j>=0) {fprintf(stderr,"%3d j %6s ",j,bigaarr[j]); j=nxtaba[j];} putc('\n',stderr);} putc('\n',stderr);*/ hphash();}hphash(){ int i,j,rlen; char *p; FILE *inputsafe; while((rlen = getregel())>-1){ tptr = regel; if((rlen>10) && (regel[8]<=' ') && !(strncmp(includfil,regel,8))) { inputsafe = inptr; while(*tptr != '"') tptr++; tptr++; p=tptr; while(*tptr != '"') tptr++; *tptr = '\0'; if((inptr = fopen(p,"r")) == NULL){ fprintf(stderr, "cannot open include file %s\n",p); inptr = inputsafe; continue;} else fprintf(stderr,"Include file found %s\n",p); hphash(); inptr = inputsafe; } else {while((j=zoektoken())>=0){ if(j){ for(i=0;i<j;i++) *sptr++ |= 0x20; tptr = sptr;} } fprintf(uitptr,"%s\n",regel);} }}main(){ inptr = stdin; uitptr = stdout; hashh();}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -