#include #include /* disk-sortierprogramm v1.0 (c) 1988 M.Schewe */ /* besteht aus disk1.c disk2.c disk3.c disk4.c disksort.c disk.h */ /* #define vorsicht /* auch c: (harddisk) zulassen -> wenn undefined */ char *buffer, * baum_array, * baum_ptr; int namen_ctr, array_runner, anfangsnr, version, blocksize, sectorsize; int woerter; int old_drive, old_user, dir_counter, timestamps; int *translate, *back; unsigned old_crc, max_bytes; struct dpb disk; struct dir_eintrag **array, *directory; FILE datei; struct knoten *baum=0; char backup_drive=0; int modus=0; int drive=0; int filecount=0; /* int vorsicht=1; /* c:auch erlaubt,wenn = 0 !!! */ extern unsigned int space(); /*************************** Funktionen ******************************/ make_translate_table() { static int index,i,maxzahl; index=0; maxzahl=woerter? 8:16; { unsigned int i=disk.al; /* anfangs-blocknr.berechnen */ while (i){ if (i MOD 2) ++index; i/=2; } anfangsnr=index; } for(i=0;ieintrag.user <16 ) { struct dir_eintrag *ptr; for(ptr=array[i];ptr;ptr=ptr->next) /* alle entries */ { int j; for(j=0;jeintrag.block.wort[j]; else nummer=ptr->eintrag.block.byte[j]; if (nummer) { translate[index]=nummer; if(woerter) ptr->eintrag.block.wort[j]=index; else ptr->eintrag.block.byte[j]=index; ++index; } else break; /* verlaesst innere for-schleife */ } } }; } sort_back() { int i; for(i=anfangsnr;idisk.dsm)||(wert2) { drive=upcase(argv[1][0])-'A'+1; backup_drive=upcase(argv[2][0])-'A'+1; } else error("usage"); if ((drive>16)||(drive<1)||(backup_drive<1)||(backup_drive>16)) error("Ungueltige Laufwerke"); if (!(drive-backup_drive)) error("Laufwerke sind gleich"); if (argc==4) modus=argv[3][0]-'0'; if ((modus<0)||(modus>3)) error("modus"); if (modus==3) { setdisk(); check_crc(); my_exit(); } /* if (!modus) printf("Bitte etwas gedulden und nicht Abbrechen !!!\n"); */ if (!modus) printf("Please be patient and do NOT abort !!!\n"); setdisk(); /* if (modus) printf ("freier Arbeitsspeicher zu Beginn:%u Bytes\n",space()); */ if (modus) printf ("free working memory before starting: %u bytes\n",space()); { int anzahl=disk.dsm+1; translate=my_alloc(4 * anzahl); back=translate+anzahl; /* beide gleich gross */ /* translate ist int * */ } read_dir(); /* baut auch sortierten baum auf + my_alloc fuer array */ ordne(); /* baut array auf */ /* if (modus) printf("Minimaler freier Speicher:%u bytes\n",space() ); */ if (modus) printf("Minimum free working memory: %u bytes\n",space() ); cfree( baum_array ); make_translate_table(); /* translate-array aufbauen,erstellt auch */ /* neue directory-blocknummern */ sort_back(); /* umkehrung von translate herstellen */ /* testet auch dir auf korrektheit */ /* if (modus) printf("Pufferspeicher fuer CRC: %u bytes\n",space() ); */ if (modus) printf("Buffer memory for CRC: %u bytes\n",space() ); crc_check(); write_dir(); /* neues directory wegschreiben */ cfree(array); cfree(directory); /* dirbuffer freigeben */ /* if (modus) printf ("freier Datenpuffer:%u Bytes\n",space()); */ if (modus) printf ("Free data buffer: %u Bytes\n",space()); sort_daten(); /* greift auf translate[] und back[] zurueck */ cfree(translate); /* macht auch cfree(back) ; s.o. */ /*if (modus) printf ("freier Arbeitsspeicher am Ende:%u Bytes\n",space()); */ if (modus) printf ("Free working memory at the End: %u bytes\n",space()); check_crc(); error("alles ok"); }