/* (bbcim) diskb_add.c: voeg bestanden aan Acorn DFS diskbeeld toe * * Copyright (C) W.H.Scholten 1996,1997 */ #if 0 /* NEW NEW NEW NEW NEW NEW NEW NEW */ int disk_add_file2(struct diskimage *image, int args, char *arglist[], int flags) { if (flags & REMOVE_INFO_FILE) ... } int d_add_file2(struct disk_data diskptr, char *filename, struct diskimage *image, struct bbcfile *beeb_file, struct file_data fileptr, int flags) { if (flags & REMOVE_INFO_FILE) ... } int d_write_data2(struct disk_data diskptr, byte *data, struct diskimage *image, struct bbcfile *beeb_file, int flags) { } /* NEW NEW NEW NEW NEW NEW NEW NEW */ #endif /* voor Acorn DFS */ int disk_add_file(struct diskimage *image, int args, char *arglist[], struct bbcfile *beeb_file, int flags) { char *disk; int addfiles; FILE *fpadd, *fpdisk; disk=image->filename; if (diskimage_sanitycheck(image, flags & VERBOSE)) return bbcim_errno; if (flags & ADD_FILES) { if (d_add_file(image, beeb_file, flags)) return bbcim_errno; } else { /* NU BESTANDEN TOEVOEGEN: */ for(addfiles=0; addfiles4) if (!strncmp(arglist[addfiles]+l-4,".inf",4)) continue; if (flags & DISK_INFO /*use_infofiles*/) { get_fileattributes_info(arglist[addfiles], beeb_file, flags & VERBOSE); if (bbcim_errno) { if (flags & VERBOSE) { #ifdef NL printf("Info bestand voor %s kan niet geopend worden, sla over\n", arglist[addfiles]); #else printf("Info file for %s cannot be opened, skipping file\n", arglist[addfiles]); #endif } continue; } } else { beeb_file->loadaddr=0; beeb_file->execaddr=0; strncpy(beeb_file->naam, arglist[addfiles],12); beeb_file->naam[9]=0; /* Should check that second char is '.' else use $.name */ if (beeb_file->naam[1]!='.') { int i; for (i=9; i>=0; i--) beeb_file->naam[i+2]=beeb_file->naam[i]; beeb_file->naam[0]='$'; beeb_file->naam[1]='.'; } beeb_file->naam[9]=0; /* LENGTE ????????*/ beeb_file->length=ftell(fpadd); } /* Moet nu inladen in beeb_file.data OF bbcfile uitbreiden met FILE *fpdata */ fpadd=fopen(arglist[addfiles], "rb"); if (fpadd==NULL) { #ifdef NL printf("Archief bestand %s kan niet geopend worden\n", arglist[addfiles]); #else printf("Archive file %s cannot be opened\n", arglist[addfiles]); #endif continue; } fread(beeb_file->data, beeb_file->length, 1, fpadd); fclose(fpadd); d_add_file(image, beeb_file, flags); } } return 0; } int d_add_file(struct diskimage *image, struct bbcfile *beeb_file, int flags) { FILE *fpdisk, *fpadd; unsigned char filebyte,H; char infofile[100]; char bbcfile_naam[15]; unsigned char afiles=0; static int addfiles; unsigned long loadaddress, execaddress; int l,i, len_s; long startsector, length, j; unsigned char eellddss, locked; unsigned int sectorsondisk; char *disk; struct bbcdisk_data disk_data; fpdisk=fopen(disk,"rb+"); /* AANTAL BESTANDEN (afiles=8*echt aantal): */ fseek(fpdisk,256+5L,SEEK_SET); fread(&afiles,1,1,fpdisk); if (afiles==31*8) { #ifdef NL bbcim_error="Er zijn al 31 bestanden op het diskbeeld\n\n"; #else bbcim_error="There are already 31 files on the diskimage\n\n"; #endif if (flags &VERBOSE) printf(bbcim_error); bbcim_errno=BBC_DISK_FULL; return bbcim_errno; } /* GET PREVIOUS STARTSECTOR AND FILE LENGTH */ if (afiles) { fseek(fpdisk,256L+14L,SEEK_SET); fread(&eellddss,1,1,fpdisk); /* STARTSECTOR */ fread(&filebyte,1,1,fpdisk); startsector=filebyte+(long)(eellddss & 0x3)*256L; /* FILELENGTE */ fseek(fpdisk,256L+12L,SEEK_SET); fread(&filebyte,1,1,fpdisk); fread(&H,1,1,fpdisk); length=H*256L+filebyte+(eellddss & 0x30)*16L*256L; startsector +=(length +255)>>8; } else startsector=2; /* NU TESTEN OF BESTANDEN BINNEN SECTORS-ON-DISK BLIJFT: */ fseek(fpdisk,256+6L,SEEK_SET); fread(&filebyte,1,1,fpdisk); H=filebyte & 3; fread(&filebyte,1,1,fpdisk); sectorsondisk=filebyte+H*256L; fseek(fpadd, 0L, SEEK_END); length=ftell(fpadd); if (startsector+((length+255)>>8)> sectorsondisk) { fclose(fpadd); #ifdef NL printf("Niet genoeg ruimte op het diskbeeld\n"); #else printf("Not enough space on the diskimage\n"); #endif bbcim_errno=BBC_DISK_FULL; return bbcim_errno; } /* COPY FILE: */ for(j=0; j<(((length+255) >>8)*256); j++) { fseek(fpadd, j, SEEK_SET); if (!fread(&filebyte,1,1,fpadd)) filebyte=0; /* ZONDER DE VOLGENDE SEEK KRIJG IK SOMS SEGMENTATIE FOUTEN */ fseek(fpdisk,startsector*256L+j,SEEK_SET); fwrite(&filebyte,1,1,fpdisk); } fclose(fpadd); if (flags & REMOVE_FILE /*remove_file*/) { remove(beeb_file->filename); remove(infofile); } /* ADD FILENAME TO CATALOGUE */ /* EERST DE CATALOGUS INGANGEN VERPLAATSEN (8 bytes opschuiven) */ for (j=255-8; j>7; j--) { fseek(fpdisk, j, SEEK_SET); fread(&filebyte,1,1,fpdisk); fseek(fpdisk, j+8, SEEK_SET); fwrite(&filebyte,1,1,fpdisk); fseek(fpdisk, j+256L, SEEK_SET); fread(&filebyte,1,1,fpdisk); fseek(fpdisk, j+8+256L, SEEK_SET); fwrite(&filebyte,1,1,fpdisk); } fclose(fpdisk); disk_data.file_address=0; /* verander */ disk_data.cat_address=2*256; /* d_seek_file(image, file, disk_data); */ d_write_cat_entry(image, beeb_file, &disk_data); if (flags & VERBOSE) { #ifdef NL printf("bestand %s toegevoegd\n", beeb_file->filename); #else printf("adding file %s\n", beeb_file->filename); #endif } return 0; }