void addface(Face *f) /* always adds at 0 */ { Face **ofaces; Rectangle r0, r1, r; int y, nx, ny; if(f == nil) return; if(first != 0){ first = 0; eresized(0); } findbit(f); nx = nacross; ny = (nfaces+(nx-1)) / nx; lockdisplay(display); for(y=ny; y>=0; y--){ /* move them along */ r0 = facerect(y*nx+0); r1 = facerect(y*nx+1); r = r1; r.max.x = r.min.x + (nx - 1)*(Facesize+Facesep); draw(screen, r, screen, nil, r0.min); /* copy one down from row above */ if(y != 0){ r = facerect((y-1)*nx+nx-1); draw(screen, r0, screen, nil, r.min); } } ofaces = faces; faces = emalloc((nfaces+1)*sizeof(Face*)); memmove(faces+1, ofaces, nfaces*(sizeof(Face*))); free(ofaces); nfaces++; setlast(); drawarrows(); faces[0] = f; drawface(f, 0); flushimage(display, 1); unlockdisplay(display); }
void delface(int j) { Rectangle r0, r1, r; int nx, ny, x, y; if(j < first) first--; else if(j < last){ nx = nacross; ny = (nfaces+(nx-1)) / nx; x = (j-first)%nx; for(y=(j-first)/nx; y<ny; y++){ if(x != nx-1){ /* move them along */ r0 = facerect(y*nx+x); r1 = facerect(y*nx+x+1); r = r0; r.max.x = r.min.x + (nx - x - 1)*(Facesize+Facesep); draw(screen, r, screen, nil, r1.min); } if(y != ny-1){ /* copy one up from row below */ r = facerect((y+1)*nx); draw(screen, facerect(y*nx+nx-1), screen, nil, r.min); } x = 0; } if(last < nfaces) /* first off-screen becomes visible */ drawface(faces[last], last-1); else{ /* clear final spot */ r = facerect(last-first-1); draw(screen, r, bgrnd, nil, r.min); } } freeface(faces[j]); memmove(faces+j, faces+j+1, (nfaces-(j+1))*sizeof(Face*)); nfaces--; setlast(); drawarrows(); }
//------------------------------------------- //destructor derlist::~derlist ( ) { setfirst ( NULL ); setlast ( NULL ); }
int main(int argc, char **argv) { int fd,i; char *buffer; size_t bufsz; int tracks,sectors,heads; #if defined __WATCOMC__ || defined __GNUC__ setvbuf(stdout,NULL,_IONBF,0); /* flush stdout every printf */ #endif Reset = 0; Zero = 0; Keep = 0; Last = 0; Verify = 0; MaxTrack = MaxHead = -1; Bytes = 0; Disk = File = ToDisk = -1; SysOnly = 0; NoAsk = 0; options(argc,argv); if ((i = disk_get_physical(Disk,&tracks,§ors,&heads)) != DISK_OK) die("BIOS error: ",disk_error(i),0); if ((buffer = malloc(bufsz = sectors * 512)) == NULL) die("Not enough memory found!"," (%u)",bufsz); printf("\n"); if (Reset) { printf("Reseting controller..."); disk_reset(Disk); printf(" Homing disk..."); if ((i = disk_read_p(Disk,0,1,0,buffer,1)) != DISK_OK) die("BIOS error: ",disk_error(i),0); printf(" OK.\n"); } printf("Drive %c: has %u tracks and %u sides.\n",Disk+'A',tracks+1,heads+1); if (Last) setlast(Disk,&MaxTrack,&MaxHead,0); if (SysOnly) setlast(Disk,&MaxTrack,&MaxHead,1); if (ToDisk == 1) printf("\nWrite file \"%s\" to disk in %c:",argv[File],Disk+'A'); else printf("\nWrite disk in %c: to file \"%s\"",Disk+'A',argv[File]); if (!NoAsk && ask(NULL) == 0) return 1; if (ToDisk == 2) /* writing file */ { if ((fd = _open(argv[File],_O_RDONLY)) != -1) { _close(fd); printf("File \"%s\" exists",argv[File]); if (ask("; overwrite?") == 0) return 1; } fd = _open(argv[File],O_CREAT|O_RDWR|O_BINARY|O_TRUNC,S_IREAD|S_IWRITE); } else { fd = _open(argv[File],O_RDWR|O_BINARY); } if (fd == -1) die("file error: ",strerror(errno),errno); errno = 0; putchar('\n'); /* on error we get back here with setjmp() returning non-zero */ if (setjmp(Jmpbuf) == 0) { /* now that everything is verified and prepared, this is the meat */ if (ToDisk == 1) i = file2disk(fd,Disk,tracks,heads,sectors,bufsz,buffer); else i = disk2file(fd,Disk,tracks,heads,sectors,bufsz,buffer); if (i == DISK_OK) printf("\nDone. \n"); /* that's not hard is it... */ } else { puts("\n\nStopped. \n"); getch(); /* eat key from kbhit() */ } _close(fd); #ifdef _WIN32 if (i) #else if ((i = disk_status(Disk)) != 0) #endif die("BIOS error: ",disk_error(i),0); if (errno) die("File error: ",strerror(errno),errno); if (Reset) { printf("\nReseting controller..."); disk_reset(Disk); printf(" Homing disk...\n"); disk_read_p(Disk,0,1,0,buffer,1); } printf("\n%ld bytes written\n",Bytes); return 0; }