#include <stdio.h> /* insert your own values */ typedef unsigned int NODE; #define ROOT_NODE 1 #define M_LETTER 0xff #define V_LETTER 24 #define M_END_OF_NODE 1 #define M_END_OF_WORD 2 #define M_NODE_POINTER 0xfffffc #define V_NODE_POINTER 2 typedef struct { int len; NODE *edge; } TItem; TItem item[32]; #define LET(a) (((a)>>V_LETTER)&M_LETTER) #define PTR(a) (((a)>>V_NODE_POINTER)&M_NODE_POINTER) #define DAWG(a) (dawg+(a)) static int nstr; static NODE *dawg; unsigned char reslengths[32]; int init() { nstr=0; /* do your initing here */ return(0); } int uninit() { /* do your uniniting here */ return(0); } /* take the char and return the number of lengths returned in reslengths[] */ int process_one_char(unsigned char c) { int rl,i; NODE *edge; rl=0; /* append a root node as last item */ item[nstr].edge=dawg+ROOT_NODE; item[nstr++].len=0; for(i=0;i<nstr;i++) { NODE w; /* ignore invalid items */ while(item[i].edge==dawg) { if(--nstr==i) break; item[i].edge=item[nstr].edge; item[i].len=item[nstr].len; } if(nstr==i) break; /* start processing valid item */ edge=item[i].edge; do { w=*edge; /* check letter at the edge */ if(LET(w)==c) { item[i].len++; /* if string matched insert its length to result array */ if(w&M_END_OF_WORD) reslengths[rl++]=item[i].len; /* go through edge, will be ignored at next char if invalid */ item[i].edge=DAWG(PTR(w)); break; } /* next edge if char didn't match */ edge++; } while((w&M_END_OF_NODE)==0); } return(rl); } int main(int argc, char **argv) { int c; FILE *fin; if(argc<2) { fprintf(stderr,"Usage: mscan filename\n"); exit(1); } init(); if(fin=fopen(argv[1],"rb")) { while((c=getc(fin))!=EOF) { process_one_char(c); } fclose(fin); } uninit(); return(0); }