#include "m.h" #include static char tr[3][Nsize+20]; static int ref_rotor = 0; static int cnx; static void W(char x){tr[ref_rotor][cnx++] = x; if(cnx>=sizeof tr[0]) bitch("Exsessive name!");} char * qs(uchar C * w) {++ref_rotor; if (ref_rotor==3) ref_rotor=0; cnx=0; {W('\"'); while(*w) {uchar x = *(w++); if(' ' <= x && x <= '~') {if(strchr("\"\\", x)) W('\\'); W(x);} else {W('\\'); W('0'+x/64); W(('0' + x/8)&7); W(('0' + x)&7);}}; W('\"'); W(0); return tr[ref_rotor];}} void sopen(sstream * s, uchar C * C fn){s->in = fopen((char *)fn, "r"); s->Bln=-4; strcpy((char *)s->name, (char *)fn);} void sclose(sstream * s) {fclose(s->in);} int sread(uchar * wh, sstream * s, b32 C loc) {b32 C b = loc>>12, v = (loc>>5)&127; int x = loc&31; if(b != s->Bln) {if(b == s->Bln+1){int m; for(m=0; m<128; ++m) ((b32 *)s->buf)[m] = ((b32 *)s->buf)[m+128]; {int ic = fread(s->buf+512, 1, 512, s->in); Eof |= !ic; for(; ic<512; ++ic) s->buf[512+ic] = 0;}} else {if(b != s->Bln+2) {int e; if((e=fseek(s->in, b*512, 0))) {fprintf(out,"Seek error %d on file %s at offset %ld.\n", e, qs(s->name), s->Bln*512); return 0;}} {int ic = fread(s->buf, 1, 1024, s->in); Eof |= !ic; for(; ic<1024; ++ic) s->buf[ic] = 0;}}} s->Bln = b; if(x){int j; for(j=0; j<128; ++j) ((b32 *)wh)[j] = ((b32 *)s->buf)[j+v] << x | ((b32 *)s->buf)[j+v+1] >> (32-x);} else {int j; for(j=0; j<128; ++j) ((b32 *)wh)[j] = ((b32 *)s->buf)[j+v];} return 1;}