Files
open-simh.simtools/extracters/rstsflx/flx.h
Paul Koning bf7c17ab4a Add RSTSFLX V2.6. This is a file system access utility for RSTS
file systems.  It supports reading and writing as well as a number
of other operations, such as octal dump, file system initialize,
and file system check ("clean").

This was originally maintained as a Subversion repository at
svn://akdesign.dyndns.org/flx/branches/V2.6.
as suggested by Timothe Litt on the SIMH mailing list.
2016-04-27 15:00:42 -04:00

228 lines
7.0 KiB
C

/* rstsflx common definitions */
/* define BROKEN_ANSI when compiling on systems that have a defective
* set of include files, like SunOS 4.1
*/
#ifdef BROKEN_ANSI
#define EXIT_SUCCESS 0
#define EXIT_FAILURE 1
#define strtoul strtol
#define SEEK_SET 0
#define FILENAME_MAX 160
#endif
/* Apple doesn't define __unix__ */
#ifdef __APPLE__
#define __unix__ 1
#endif
#include "rstsflx.h" /* include mainline's prototypes */
/* macro to map a struct onto a given offset of fibuf */
#define use(str,off) ((str *)(&fibuf[(off)]))
#define clumap (use(fdcm,BLKSIZE-sizeof(fdcm)))
#define fibufw ((word16 *)(&fibuf[0]))
/* block numbering conversions */
#define dcntolbn(dcn) ((dcn)*dcs) /* convert DCN to LBN */
#define pcntolbn(pcn) ((pcn)*pcs+dcs) /* convert PCN to LBN */
#define lbntodcn(lbn) ((lbn)/dcs) /* convert LBN to DCN */
#define lbntopcn(lbn) (((lbn)-dcs)/pcs) /* convert LBN to PCN */
#define dcntopcn(dcn) (((dcn)-1)*dcs/pcs) /* convert DCN to PCN */
#define pcntodcn(pcn) ((pcn)*pcs/dcs+1) /* convert PCN to DCN */
/* other handy macros */
#define UP(x,y) (((x)+(y)-1)&(-(y))) /* round x up to mult of y */
#define DOWN(x,y) ((x)&(-(y))) /* round x down to mult of y */
/* buffer marking */
#define MARKS (womsat = TRUE) /* mark SATT dirty */
#define MARKF (fiblkw = TRUE) /* mark FIBUF dirty */
/* common constants */
#define FALSE 0
#define TRUE 1
/* Useful general data types
*
* Note: "int" is being used here whenever 16 bits suffice;
* "long int" where 32 bits are needed. In some platforms,
* we'll end up with more bits than that, which is not a problem.
* Whenever data types of a specific size (rather than just a
* minimum size) are needed, the types defined in platform.h are used.
*/
typedef unsigned char byte;
typedef unsigned int word;
typedef unsigned long int lword;
/* bring in platform specific type definitions */
#include "platform.h"
/* lengths of various strings, including null terminator */
#define NAMELEN 11 /* file name.ext */
#define DATELEN 12 /* Y2k style date (4 digit year) */
#define RTIMELEN 9 /* RSTS style time */
#define RTSLEN 7 /* Runtime system name */
/* buffer sizes */
#define BLKSIZE 512 /* one disk block */
#define LSIZE 512 /* length of line buffer */
/* error codes; sometimes return codes, sometimes fatal error codes */
#define BADRE 0
#define BADLINK 1
#define BADBLK 3
#define BADDCS 4
#define CORRUPT 5
#define NOMEM 6
#define INTERNAL 7
#define DIRTY 8
#define ROPACK 9
#define DISKIO 10
#define NOMSG 11 /* used when caller generates the message */
#define BADPAK 12 /* pack cannot be rebuilt */
#define rabort(code) doabort (code, __FILE__, __LINE__)
/* file scan codes for "dofiles" */
#define NOTNULL 0
#define NULLISNULL 1
#define NULLISWILD 2
/* open modes */
#define DREADMODE "rb" /* read only disk access */
#define DWRITEMODE "r+b" /* read/write disk access */
#define DCREATEMODE "w+b" /* creating new container file */
/* data types */
typedef struct { /* switch flag table layout */
char *ascii;
char *bswitch; /* binary or brief (in list) */
char *clusiz;
char *contig;
char *create;
char *rstsdevice;
char *debug;
char *end;
char *full;
char *merge;
char *oattr;
char *odt;
char *offset;
char *prot;
char *query;
char *replace;
char *rmsvar;
char *rmsfix;
char *rmsstm;
char *size;
char *disksize;
char *start;
char *summary;
char *tree;
char *unprot;
char *verbose;
char *wide;
char *overwrite;
char *narrow;
char *user;
char *hex;
} swtab;
#define f_name 1 /* name present */
#define f_namw 2 /* name wild */
#define f_ext 4 /* extension present */
#define f_extw 8 /* extension wild */
#define f_ppn 16 /* PPN present */
#define f_ppnw 32 /* PPN wild */
#define f_prot 64 /* protection code present */
#define F_WILD (f_namw | f_extw | f_ppnw) /* something wild if set */
typedef struct {
long size; /* filesize */
int clusiz; /* cluster size */
int flags; /* parse flags */
word nlink; /* link to NE */
word alink; /* link to AE */
word rlink; /* link to first RE */
word rmslink; /* link to attributes */
word recfmt; /* record format and flags for fileio */
word recsiz; /* record size (if fixed records) */
word rechdrsiz; /* header size if vfc */
long eofblk; /* EOF block number from RMS */
int eofbyte; /* EOF byte from RMS */
word currecsiz; /* size of current (split across buffers) rec */
word recskip; /* amount to skip for vfc */
char *currec; /* current record pointer */
byte stat; /* saved file status */
byte prot; /* saved file protection */
byte proj; /* supplied PPN as two bytes */
byte prog;
char name[NAMELEN]; /* supplied file name.ext */
byte newprot; /* protection code from filespec */
byte cproj; /* current PPN as two bytes */
byte cprog;
char cname[NAMELEN]; /* current name.ext */
} firqb; /* well, sort of... :-) holds parsed filename */
/* typedefs for procedure datatypes, used to work around cc -protoi bug */
typedef void (*commandaction)(firqb *);
typedef void (*commandhandler)(int, char **);
typedef void (*iohandler)(long, long, void *);
/* external references: */
extern swtab sw; /* switch and argument pointers */
extern char *progname; /* name of this program */
extern byte fibuf[BLKSIZE]; /* buffer for directories */
extern byte *sattbufp; /* pointer to SATT buffer */
extern int sattsize; /* size of SATT in bytes */
extern long sattlbn; /* start LBN of SATT */
extern long satptr; /* current allocation pointer (PCN) */
extern int womsat; /* TRUE if SATT needs to be written */
extern long fiblk; /* current block in FIBUF */
extern int fiblkw; /* TRUE if FIBUF needs to be written */
extern long i,k; /* current directory entry pointers */
extern int pcs; /* pack clustersize */
extern long pcns; /* number of pack clusters on this disk */
extern int pflags; /* pack flags */
extern int plevel; /* pack structure rev level */
extern long mfddcn; /* DCN of start of MFD */
extern long mfdlbn; /* LBN of start of MFD */
extern char pname[7]; /* pack ID in ascii */
extern int dcs; /* device clustersize */
extern long diskblocks; /* device block count */
extern const char *rname; /* file name of disk/container */
extern const char *rssize; /* and size, as a string */
extern long rsize; /* size of RSTS disk or container file */
extern int absflag; /* flag for absolute I/O */
extern FILE *rstsfile; /* file for the rsts disk/container */
extern char **fargv; /* array of pointers to arguments */
extern int fargc; /* and count of how many we found */
extern char *iobuf; /* general file I/O buffer */
extern long iobufsize; /* size of the buffer */
extern int entptr; /* current directory entry allocation pointer */
extern word nextlink; /* link to next file (ulnk of current) */
extern word prevlink; /* link to predecessor file */
extern word nextppnlink; /* link to next PPN for RDS 0 */
extern word prevppnlink; /* link to prececessor of PPN for RDS 0 */
extern long curgfd; /* LBN of start of current GFD */
extern char *defdevice; /* default RSTS device name */
extern char *defsize; /* and size */
extern long newhistitems; /* new history items this session */