#include #define gotoyx(y,x) printf("\033[%d;%df",y,x) #define vall(a) itm[a].val #define EMPT 0520 #define E1 01000000L #define hdcsr (*(unsigned int*)0177130) #define bhdcsr (*(char *)0177130) $$narg=1; struct cbf { int $cb : 11; int $wb : 1; int $nb : 1; int $rw : 1; int $on : 1; int $sp : 1; }; struct partit { struct cbf cb; int cn,hb,hn,sb,sn; int rll,rlh,szl,szh; }; unsigned int * ppp; char $empty[EMPT]; unsigned $sec, $head, $track, $sizel,$sizeh; unsigned $pcm, $gap3; struct partit prt[8]; unsigned $sign=0123456; struct que { int blk; char fun,dev; int *buf; int cntw; } qq; char home[]="\033[1;1f", eras[]="\033[2J", erasl[]="\033[2K", curs[]="\033W", msg0[]="Error open menu file", msg1[]="Error menu file format", msg2[]="Error: invallid item type", msg3[]="Error: invalid key", wm1[] ="Warning: sum of partition's size's exceed total", wm2[] ="Warning: invalid parameter in partition #"; #define SPACE 1 #define UP 2 #define DO 3 #define LE 4 #define RI 5 #define DIGIT 6 #define LETTER 7 #define DEL 8 #define ESC 9 #define FMT 10 #define UPD 11 #define WRITE 12 #define SIZE 13 #define VERIFY 14 #define GET 15 #define HELP 16 #define ILL 17 #define QUIT 0 char ctype[128] = { ILL, ILL, ILL, ILL, ILL, ILL, ILL, ILL, ILL, ILL, ILL, ILL, ILL, ILL, ILL, ILL, ILL, ILL, ILL, ILL, ILL, ILL, ILL, ILL, ILL, ILL, ILL, ESC, ILL, ILL, ILL, ILL, SPACE, ILL, ILL, ILL, ILL, ILL, ILL, ILL, ILL, ILL, ILL, ILL, ILL, ILL, ILL, ILL, DIGIT, DIGIT, DIGIT, DIGIT, DIGIT, DIGIT, DIGIT, DIGIT, DIGIT, DIGIT, ILL, ILL, ILL, ILL, ILL, ILL, ILL, UP, DO, RI, LE, ILL, FMT, GET, HELP, ILL, ILL, ILL, ILL, ILL, ILL, ILL, ILL, QUIT, ILL, SIZE, ILL, UPD, VERIFY, WRITE, ILL, ILL, ILL, ESC, ILL, ILL, ILL, ILL, ILL, ILL, ILL, ILL, ILL, ILL, FMT, GET, HELP, ILL, ILL, ILL, ILL, ILL, ILL, ILL, ILL, QUIT, ILL, SIZE, ILL, UPD, VERIFY, WRITE, ILL, ILL, ILL, ILL, ILL, ILL, ILL, DEL }; char inter[32*2]; struct item { int lin; int col; int wid; int typ; long val; } itm[102]; int vect[9*12]; int y=9, x=12, cnt=102; main() { int a; freopen("tt:","wwu",stdout); menu("hard.mnu"); /* putchar(a); */ } err(mesg) char * mesg; { msg(mesg); exit(0); } sspace(ff) FILE * ff; { register a; while ((a=getc(ff)) == ' '); ungetc(a,ff); } menu(mfile) char * mfile; { FILE * inf; char line[80]; register i,j; int k,tmp,fl=0; if ((inf=fopen(mfile,"r")) == NULL ) err(msg0); _puts(home); _puts(eras); _puts(curs); $ttymode(1); /* Display text */ fgetss(line,80,inf); do { msg(line); if (fgetss(line,80,inf) == NULL) break; } while (line[0] != '%'); if (line[0] != '%') err(msg1); /* Now read item's */ for(i=0; i < cnt; i++) { fscanf(inf,"%d",&itm[i].lin); fscanf(inf,"%d",&itm[i].col); fscanf(inf,"%d",&itm[i].wid); sspace(inf); /* skip space's */ itm[i].typ=tmp=getc(inf); switch(tmp){ break; case 'L': case 'I': fscanf(inf,"%ld",&itm[i].val); break; case 'C': sspace(inf); tmp=itm[i].val=getc(inf); break; default: err(msg2); } } /* for */ fgetss(line,80,inf); fgetss(line,80,inf); if (line[0] != '$') err(msg1); for(i=0; i< x*y; i++) { fscanf(inf,"%d",&tmp); vect[i]= tmp-1; } get(); if ($sign == 0123456) unpack(); /* get part info */ displ(); pitm(0,1); i=0; while(ctype[tmp=_getchar()]) { gotoyx(23,1); _puts(erasl); switch(ctype[tmp]) { case ESC: fl++; break; case UP: if (fl!=2) return(tmp); fl=0; i=next(-x,i); break; case DO: if (fl!=2) return(tmp); fl=0; i=next(x,i); break; case LE: if (fl!=2) return(tmp); fl=0; i=next(-1,i); break; case RI: if (fl!=2) return(tmp); fl=0; i=next(1,i); break; case DIGIT: switch(itm[i].typ) { case 'C': break; case 'I': case 'L': itm[i].val=itm[i].val*10+tmp-'0'; comp(i); break; } break; case DEL: if( itm[i].typ == 'C') break; itm[i].val=itm[i].val/10L; break; case SPACE: if( itm[i].typ != 'C') break; if( itm[i].val == '-') itm[i].val = '+'; else itm[i].val = '-'; break; case SIZE: pitm(i,0); usize(); break; case VERIFY: pitm(i,0); i=verify(); break; case GET: get(); if( $sec != 0123456 ){ gotoyx(23,1); _puts("Invalid partition data"); break; } unpack(); displ(); break; case FMT: if ((j=verify())==0) { format(i); break; } i=j; break; case UPD: if ((j=verify())) { i=j; break; } pack(); update(); gotoyx(23,1); _puts("Update coplete"); break; case WRITE: if ((j=verify())) { i=j; break; } write(); gotoyx(23,1); _puts("Write complete"); break; case HELP: pitm(i,0); help(); break; default: break; } pitm(i,1); } _puts(curs); $ttymode(0); gotoyx(23,1); } help() { gotoyx(20,1); _puts(" U - Update (Занести таблицу в контроллер) Q - Quit (Выход)\n\r"); _puts(" G - Get (Взять таблицу из контроллера) \n\r"); _puts(" W - Write (Записать таблицу на диск) \n\r"); _puts(" S - Size (Вычислить размеры) ←↓↑→ - Перемещение указателя\n\r"); _puts(" F - Format (Форматировать раздел) Space - Измение состояния флага"); _getchar(); $ttymode(2); while(_getchar()) ; $ttymode(1); gotoyx(20,1); _puts("\033[J"); } usize() { register j,k; itm[3].val =(long)( itm[0].val * itm[1].val * itm[2].val ); pitm(3,0); for(k=0;k<8;k++) { j=k*12+4; itm[j+6].val=(long)( itm[j+1].val * itm[j+3].val * itm[j+5].val ); pitm(j+6,0); } } verify(i) { register j,k; if(itm[3].val < (itm[10].val+itm[22].val+ itm[34].val+itm[46].val+ itm[58].val+itm[70].val+ itm[82].val+itm[94].val) ) { gotoyx(23,1); _puts(wm1); return(i); } for(j=0; j<8; j++) if (k=tpbou(j)) { gotoyx(23,1); _puts(wm2); printf(" %1d",j); return(k); } return(0); } write() { qq.blk = 0123456; qq.fun = 0361; qq.dev = 0; qq.buf = (& $empty); qq.cntw = -1; execute(); return; } get() { qq.blk = 0; qq.fun = 0360; qq.dev = 0; qq.buf = (& $sec); qq.cntw = 1; execute(); return; } update() { qq.blk = 0; qq.fun = 0360; qq.dev = 0; qq.buf = (& $sec); qq.cntw = -1; execute(); return; } format(i) { register j,k; char *p; pack(); update(); if( (i<4) || (i >= (4+8*12)) ) { gotoyx(23,1); _puts("No Partition pointed"); return; } k=(i-4)/12; /* part#, dev# */ i=k*12+4; gotoyx(23,1); _puts(curs); $ttymode(0); printf("Partition #%1d format; Are you sure ? ",k); gets(inter); $ttymode(1); _puts(curs); if ( (inter[0] & 0137) != 'Y') return; for(j=0,p=inter; j < $sec; j++) { *p++=0; *p++=(j+k*040); } if ( vall(i+9) == '+' ) inter[1]=0377; /* st1 -> -1 sect */ qq.blk = 0; qq.fun = 0362; qq.dev = k; qq.buf = inter; qq.cntw= 0123456; for( j=0; j k */ if( itm[n].val+itm[n+1].val > itm[k].val ) if( itm[n+2].val < itm[k+2].val ) { if( itm[n+2].val+itm[n+3].val > itm[k+2].val ) return(k); } else { if( itm[k+2].val+itm[k+3].val > itm[n+2].val ) return(k); } } else { if( itm[k].val+itm[k+1].val > itm[n].val ) if( itm[n+2].val < itm[k+2].val ) { if( itm[n+2].val+itm[n+3].val > itm[k+2].val ) return(k); } else { if( itm[k+2].val+itm[k+3].val > itm[n+2].val ) return(k); } } } if( itm[n].val+itm[n+1].val > itm[0].val ) return(n+1); if( itm[n+2].val+itm[n+3].val > itm[1].val ) return(n+3); if( itm[n+4].val+itm[n+5].val > itm[2].val ) return(n+5); if( (itm[n+1].val * itm[n+3].val * itm[n+5].val) != itm[n+6].val ) return(n+6); if( (itm[n].val == 0) && (itm[n+9].val != '+') ) return(n+9); return(0); } long comp(i) { long a=10L; register j=itm[i].wid; for( ; j>1; j--) a*=10L; if( itm[i].val >= a ) itm[i].val=itm[i].val/10L; return(a); } next(d,i) int d,i; { register j=0; pitm(i,0); while (vect[j] != i) j++; while ( ((j+d) >= 0) && ((j+d) < (x*y))) { if (vect[j+d] != i) { i=vect[j+d]; return(i); } else j+=d; } return(i); } pitm(i,rev) { char str[20],*s=str; gotoyx(itm[i].lin,itm[i].col); if(rev) _puts("\033[7m"); s=str; *s++='%'; switch(itm[i].typ) { case 'I': case 'L': sprintf(s++,"%1d",itm[i].wid); *s++='l'; *s++='d'; break; case 'C': str[0]=itm[i].val; break; default: err(msg2); } *s++=0; printf(str,itm[i].val); _puts("\033[0m"); }