home *** CD-ROM | disk | FTP | other *** search
- /*******************************************************************************\
-
- include file
-
- suntar 1.3, ⌐1991-92 Sauro & Gabriele Speranza
-
- This program is public domain, feel free to use it or part of it for anything
-
- \*******************************************************************************/
- #include <setjmp.h>
-
- #define V_13
-
- #define hqxID 145
- #define writeID 132
- #define hackID 133
- #define tarPopupID 146
- #define ntAPopupID 147
-
- #define fmGetInfo 1
- #define fmOpen 2
- #define fmClose 3
- #define fmEject 3
- #define fmCopy 5
- #define fmList 6
- #define fmExtract 7
- #define fmSelect 8
- #define fmAppend 10
- #define fmWriteTar 11
- #define fmWriteBar 12
- #define fmFormat 14
- #define fmPause 16
- #define fmAbort 17
- #define fmQuit 18
- #define last_fm_command fmFormat
-
- #define pmOptions 6
- #define pmEnglish 10
- #define pmConfirm 11
- #define pmExpert 8
- #define pmIgnore 12
- #define pmNoConvers 13
-
- #define wmDataFork 1
- #define wmASCII 2
- #define wmWriteMacBin 3
- #define wmWriteTar 4
- #define wmEndWrite 6
-
- #define hmView 1
- #define hmClear 2
- #define hmSave 3
- #define hmOverwrite 4
- #define hmMac_ize 5
- #define hmDriveList 6
- #define hmFind 7
- #define hmUntar 8
- #define hmUnbar 9
- #define hmList 10
- #define hmAgain 11
-
- #define bmDisable 1
- #define bmShowExtr 3
- #define bmSaveInfo 4
- #define bmShowList 6
-
- #define ff_tarbar 1
- #define ff_ASCII 2
- #define ff_macbin 3
- #define ff_c_macbin 4
- #define ff_binhex 5
- #define ff_packit 6
-
- #define SHOWINFO (all_listonly&&(disable_binhex&4) || (!all_listonly&&(disable_binhex&2) ))
- #define SAVEINFO (!listonly&&(disable_binhex&9)==8)
-
- /* this define is used to compare the return value of a menu selection
- with known menu items */
- #define menuItemMess(ID,item) (((long)ID<<16)+item)
-
- #define signature 'S691'; /* useless, since OpenWD usually ignores it... */
-
- #ifndef LF
- #define LF '\012' /* '\n' in Think C, '\r' in MPW */
- #define CR '\015' /* '\r' in Think C, '\n' in MPW */
- #endif
-
- #define highbyte(x) (((unsigned char *) &(x))[0])
- #define lowbyte(x) (((unsigned char *) &(x))[1])
-
- #define max_drive 4
-
- typedef long sector_t;
- #define SECTOR_T_SIZE 4
-
- typedef struct tarh_type{
- char name[100];
- char mode[8];
- char uid[8];
- char gid[8];
- char size[12];
- char mtime[12];
- char chksum[8];
- char linkflag;
- char linkname[100];
- char magic[8];
- char uname[32];
- char gname[32];
- char devmajor[8];
- char devminor[8];
- /* these following fields were added by JF for gnu */
- /* and are NOT standard */
- char atime[12];
- char ctime[12];
- char offset[12];
- char longnames[4];
- char fill[127];
- } tarh_type;
- extern tarh_type tarh;
-
- typedef struct barh_type{ /* dalla documentazione UNIX
- -- from the bar(5) page of man */
- char mode[8];
- char uid[8]; /* in ottale nell'header di file, in decimale in quello di volume
- --in octal in file headers, decimal in volume headers */
- char gid[8]; /* idem */
- char size[12]; /* in ottale; nel volume header, Å il numero di bytes restanti del
- file a metê tra due dischetti (sempre multiplo di 512)
- -- in octal; in the volume header, it's the number of bytes
- remaining from a previous file (always multiple of 512) */
- char mtime[12]; /* in ottale, secondi dal 1 gen 1970
- -- in octal, seconds since 1 jan 1970 */
- char chksum[8]; /* in ottale */
- char rdev[8]; /* ??? */
- char linkflag;
- char bar_magic[2]; /* 'V\0', solo nell'header di volume
- -- 'V\0', only in the volume header */
- char volume_num[4]; /* decimale... */
- char compressed; /* '0', solo nel volume header
- -- '0', only in the volume header */
- char cdate[12]; /* nel volume header, dice quando si e' creato l'archivio: YYMMDDHHmm\0
- -- in the volume header, archive creation date: YYMMDDHHmm\0 */
- char name[100];
- char linkname[100]; /* in file normali tutto 0, come i seguenti...
- perÿ, non Å cosô: il nome del link parte immediatamente
- dopo il \0 che chiude il nome, non ad un offset fisso
- -- see comments in the untar.c file */
- char uname[32];
- char gname[32];
- char devmajor[8];
- char devminor[8];
- char fill[148];
- } barh_type;
-
- extern struct binh_type{
- /*byte version;*/ /* the first byte is present in the MacBinary file but is
- NOT copied to this struct, so that the most commonly used
- fields start at an even address */
- unsigned char nlen; /* Length of filename. */
- char name[63]; /* Filename (only 1st nlen are significant) */
- FInfo finfo; /* type, creator, flags, zero1 (flags 0-7 must be cleared),
- point in folder, enclosing folder */
- char protected; /* = 1 for protected file, 0 otherwise */
- char zero; /* must be 0 */
- long dflen; /* Data Fork length (bytes) */
- long rflen; /* Resource Fork length */
- long cdate; /* File's creation date */
- long mdate; /* File's "last modified" date */
- short gilen; /* GetInfo message length (MacBinary II only) */
- char extra_fflags; /* Finder flags, bits 0-7 (MacBinary II only) */
- char unused[14];
- char packlen[4]; /* length of total files when unpacked */
- char headlen[2]; /* length of secondary header (MacBinary II only) */
- unsigned char uploadvers; /* Version of MacBinary II that the uploading program is written for */
- unsigned char readvers; /* Minimum MacBinary II version needed to read this file */
- char crc[2]; /* CRC of the previous 124 bytes */
- char padding[2]; /* two trailing unused bytes */
- } macbinh;
-
- extern int err_code; /* error code from read_sectors and write_sectors */
- extern short drive_number;
-
- extern Boolean non_convertire; /* disable conversions */
- extern OSType text_creator;
- extern Boolean ignore_errors,in_Italia,expert_mode,confirm_saves,bar_archive,multiVolume;
- extern unsigned char listonly;
- extern unsigned int max_hqx_header;
- extern unsigned char previousFormat;
- extern short info_file_open;
- extern int info_file;
- extern short current_crc,disable_binhex;
- extern short show_info;
- extern Boolean save_info;
-
- extern long hqx_length;
- extern sector_t sect_n,sectors_on_floppy;
-
- extern SFReply reply;
- extern Point where[];
- extern MenuHandle myMenus[4],hqxM;
- extern jmp_buf main_loop;
- extern unsigned char disk_buffer[512];
- extern char ultimo_header[184]; /* non tutto, solo la parte che tiene i campi
- importanti: lo uso sia in lettura sia in scrittura
- -- see in untar.c and tar.c */
- extern Boolean ultimo_disco_espulso,ultimo_header_valido;
- extern sector_t avail_sectors_for_file;
- extern long last_offset;
- extern Boolean gHasResolveAlias;
- extern Boolean hasVheader;
- extern int inputFile;
- extern Boolean inf_is_open;
- extern unsigned char file_aperto;
- extern int floppy_n;
- extern sector_t settori_passati;
- extern int curr_vrefnum;
-
-
- enum tipo_fase {
- /* the "fase" (phase) variable always remembers what suntar is currently doing, so that
- some decisions may be performed by any function, not only by the higher levels of
- the functions hierarchy */
- non_faccio_nulla, /* nessun comando in corso di esecuzione, in attesa di uno
- -- no command is being executed, waiting for one */
- ricevuto_comando, /* ho ricevuto un comando ma sono ancora nei preliminari
- (aspetta_inserzione...) e posso ancora uscirne premendo un
- bottone di annulla
- -- received a command, but I am in the preliminary phase
- of its execution (disk insertion dialog box...) hence the
- command may still be cancelled by clicking on a button */
- paused, /* tra Pause e Resume... */
- in_writing, /* sono nel men¥ di writing, pronto a ricevere comandi
- -- ready to accept commands from the Write menu */
- reading_sect_n, /* sto leggendo un numero di settore dalla console
- -- in expert mode, reading from the console */
- initializing, /* sto eseguendo il comando di inizializzare un disco: a
- differenza dagli altri casi, la fase diventa questa prima
- di chiamare aspetta_inserzione
- -- initializing a disk: in this case, the phase includes
- the preliminaries which otherwise are ricevuto_comando
- */
- writing_disk, /* sto realmente scrivendo su floppy disk, ma potrei
- anche essere in pausa per attesa disco successivo o per il
- comando "Pause": se sono chiamato da MainEvent posso usare la
- variabile sto_lavorando per sapere se non sono nÄ in pausa
- nÄ in semimodal e finestra_sm_aperta per sapere se sono
- in semimodal: assolutamente non assegnare quelle variabili!
- -- writing to a floppy disk, or maybe paused or waiting for
- another disk: the two variables sto_lavorando (I'm working) and
- finestra_sm_aperta (semimodal window is open) may be consulted to
- distinguish the three cases
- */
- reading_disk, /* sto realmente leggendo da floppy disk, ma come sopra
- -- as above... */
- hack_listing, /* sto eseguendo un expert list
- -- executing the expert list command
- */
- hack_reading, /* sto eseguendo un untar at sector o unbar at sector
- -- executing untar at sector or unbar at sector
- */
- selected_reading /* sto leggendo col comando Extract selected files
- -- reading by "Extract selected files" */
- };
- extern enum tipo_fase fase;
-
- enum os_type {unknown_os,mac_MFS,mac_HFS,msdos};
- extern struct disk_info{
- Boolean is_not_initialized,is_write_protected;
- enum os_type os;
- short disk_code; /* as the return value of PBMountVol, but often it's
- computed by suntar itself */
- /* the following fields are useful only if the disk must be initialized */
- sector_t max_format;
- short format_index,
- supports_720K;
- } di;
-
- enum formats{unreadable_disk,tar_format,bar_format,unknown_format};
-
- typedef struct {
- OSType tx_cr;
- #define text_creator options.tx_cr
- short d_back; /* delay when going to background during a disk write */
- #define delay_back options.d_back
- unsigned short m_to_beep;
- #define min_to_beep options.m_to_beep
- #ifdef V_122
- unsigned char opt_bytes[12];
- #else
- unsigned char opt_bytes[20];
- #endif
- #define tar_version options.opt_bytes[0] /* popup */
-
- #define tar_unknown 0
- #define tar_singlevol 1
- #define tar_GNU 2
- #define tar_AIX 3
-
- #define accetta_GCR options.opt_bytes[1]
- #define resolve_aliases options.opt_bytes[2]
- #define crea_mac_dir options.opt_bytes[3]
- #define non_text_ASCII options.opt_bytes[4] /* was radio buttons, now is popup */
- #define save_modi_date options.opt_bytes[5]
- #define useSys7_SF options.opt_bytes[6]
- #define del_incompl options.opt_bytes[7]
- #define trunc_14 options.opt_bytes[8]
- #define pres_underscore !options.opt_bytes[9]
- #define suppress_shell_chars !options.opt_bytes[10]
- #define verify_writes options.opt_bytes[11]
- #define smallFilesAreASCII options.opt_bytes[12]
-
- #define first_check_option 1
- #define last_check_option 12
- #define skip_check_option 4
-
- #ifdef V_13 /* new field added in the 1.3; I preferred not to alter
- the layout of the previous fields in case somebody uses
- ResEdit to move his old OPTs resource to the new version
- */
- OSType gif_cr;
- #define gif_creator options.gif_cr
- #endif
- } options_type;
- extern options_type options;
-
- /* prototypes for untar.c */
- char *p2cstr(unsigned char*);
- unsigned char*c2pstr(char*);
- void mcopy(char *,char *,unsigned short);
- void init_hd_buffering(void);
- short readblock(char*,int);
- void unget_block(void);
- void unget_char(void);
- void end_of_file(void);
- void skip_file(long);
- void stampa_buffer(sector_t,unsigned char *);
- short isASCII(long,int*);
- Boolean print_if_string(char*,char*,int);
- void my_untar(void);
- void my_unbar(void);
- short unbar_checksum(unsigned char *,int,long *);
- unsigned char guess_bar_linkflag(void);
- void unbar(void);
- void copia_ultimo_header(char*,sector_t);
- void bar_check_floppy_swap(short);
- short inserzione_assicurata(char*,Boolean);
- short bar_check_settore0(sector_t*,Boolean);
- void tar_check_floppy_swap(int);
- short tar_check_settore0(Boolean);
- void close_or_del_out_file(void);
- void check_confirmation(void);
- void check_conf_dir(char*);
- void my_itoa(long,char *);
- void clear_unused_fields(void);
- void print_type_creator(OSType,OSType);
- void print_one_date(long,char*);
- #ifdef V_122
- void controlla_spazio(long,long);
- void conferma_invisibili(void);
- #else
- short controlla_spazio(long,long);
- short crea_e_controlla(Boolean);
- #endif
- void get_openfile_location(int);
- void untar_hqx (long);
- void write_hqx_fork(short,long);
- void write_pit_fork(short,long);
- void set_binhex(void);
- short untar_checksum(unsigned char*,int,Boolean);
- short chkmacbin (long ,int);
- void setdata (void);
- void untar (void);
- void untar_file (long);
- void untar_data (long);
- void untar_macbin (long);
- void writefork(short,long,Boolean);
- void setmacbin (void);
- void untar_directory (void);
- void create_directory (char *);
- short create_file (char *,int,Boolean);
- void untar_link (void);
- void unix_to_mac (char *);
- long untar_number (char*,short);
- void pbsyserr (IOParam *);
-
- /* prototypes for suntar.c */
- void apri_archivio(void);
- void chiudi_archivio(void);
- void copia_da_disco_a_file(void);
- void estrai_da_floppy(void);
- void scrivi_su_floppy(void);
- void disk_initialize(void);
- enum formats identify_format(void);
- short apri_file(char *,int *);
- OSErr new_text_file(int*);
- OSErr create_overwrite(OSType,OSType,int *);
- int mac_fread(char*,int,short);
- int mac_fwrite(char*,int,short);
- OSErr open_overwrite (char *,short,int *);
- Boolean my_disk_is_in(void);
- void handle_pause(void);
- void check_events(void);
- short check_error_and_events(void);
- void accept_abort_command(void);
- Boolean is_abort_command(void);
- Boolean is_pause_command(void);
- short aspetta_inserzione(char*);
- void check_foreground(void);
- void beep_in_foreground(void);
- void about_box(void);
- Boolean check_all_zero(char *);
- void print_info(char *,long);
- void raise_error(void);
- void error_message(char *);
- void error_message_1(char *,int);
- short check_error(void);
- void hacking(int);
- short read_sect_n(sector_t *);
- short my_atoi(char*,int*);
- short my_atol(char*,long*);
- void overwrite_sectors(void);
- void print_sector_n(sector_t);
- void stampa_info_bar(int);
- void DriveList(void);
- void fine_lavoro(void);
- void set_skip_all(int);
- void prefs_da_risorsa(void);
- void load_options(void);
- void save_options(void);
-
- /* prototypes for diskdriver.c */
- void disk_format(Boolean);
- short testa_stato(short*,Boolean);
- Boolean is_wrprot(void);
- enum os_type riconosci_disco_mac(unsigned char*);
- void identifica_hardware(void);
- void init_buffering(void);
- void check_allocated(void*);
- void flush_buffers(void);
- void invalid_buffers(void);
- void invalid_after(sector_t);
-
- Boolean dirty_buffers(void);
- void leggi_settore(sector_t,char*);
- void scrivi_settore(sector_t,char*);
- void diskEject(void);
- void read_sectors(sector_t,char*,int);
- void write_sectors(sector_t,char*,int);
- void read_one_sector(sector_t,char *,short);
-
- /* prototypes for tar.c */
- void fillmem(char*,char,int);
- void reset_sector_count(void);
- void warning_400_800(void);
- void printf_protetto(void);
- short warning_first_write(int);
- void de_Mac_ize(char*);
- void write_tar_volume_header(void);
- void write_bar_volume_header(void);
- short bar_header(char *,long,barh_type *);
- void bar_checksum(char *);
- void writeblock(char*,int);
- unsigned char get_linkflag(long *);
- void cerca_fine(void);
- void svuota_buffer(void);
- void azzera_settore(void);
- void tronca_archivio(void);
- Boolean compare_mem(char*,char*,int);
- void print_ready(void);
- void check_and_eject(void);
- void check_wr_err(void);
- void my_tar(int);
- void close_input_files(void);
- void FillMacBin2Fields(void);
- void assegna_tar_version(void);
- void controlla_che_ci_stia(sector_t);
- void tar_file_or_folder (char *);
- void tardir (char *);
- void tarfile (char*);
- void tardata (char*,short);
- void tarmacbin(char*,short);
- void macbinheader(void);
- void tar_writefork (long,int);
- short tarheader (char *,long);
- void fill_checksum(tarh_type *);
- void mac_to_unix(char*,char*);
- void numstr (char *,long,int);
- void statf (char *);
- short getvrefnum (char *);
- void nametoolong (char *);
-
- /* prototypes for dialogs.c */
- void options_box(void);
- void select_and_extract(void);
- void my_alert(void);
- short my_modal_dialog(short,char **i,int);
- void SetCheckBox(DialogPtr,short);
- int dialogo_tipo_file(void);
-
- /* prototypes for dehqx.c */
- void close_info_file(void);
- int ci_strcmp(char*,char*);
- short is_hqx_name(void);
- void check_CRC(void);
- short hqx_header(void);
- void FindStart (void);
- void init_hqx_tab(void);
- void read_hqx(char *,int);
- int read_3_hqx(unsigned char *,int);
- unsigned char get_hqx_byte(Boolean *);
- void open_info_file(void);
- void flush_hqx_header(int);
- void hqx_end_of_file(void);
- void CalcCRC(char);
-
- /* prototypes for unpit.c */
- void my_unpit(void);
- void get_pit_bytes(char*,int);
- void deall_tree(void);
-
- /* prototypes for folderSTDfile.c */
- void my_SF_Put(unsigned char *,unsigned char *);
- void my_SF_Get(short,SFTypeList);
- int get_file_or_folder(Str255,short,SFTypeList*);
- void select_directory(void);
- Boolean get_file_with_checkbox(Boolean *);
- Boolean SFPut_con_pausa(unsigned char *);
- void close_all_open_WD(void);
- void register_WD(short);
-
- /* prototypes for StdFile.c & selectbutton.c */
- void pStrcat(unsigned char *,unsigned char *);
- void pStrcpy(unsigned char *,unsigned char *);
- OSErr PathNameFromDirID(long,short,char*);
- void doForceDirectory(WDPBRec*);
- void SetRadioButton(DialogPtr,short,short);
- void SelectButton(ControlHandle);
- void OutlineControl(ControlHandle);
-
- /* prototypes for semimodal.c */
- int semimodalDialog(int,Point *,int (*)(EventRecord*),char **,int,
- Str255,Str255,Str255,int,Boolean);
- void close_semimodal(void);
-
-