|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T b
Length: 5714 (0x1652) Types: TextFile Names: »b_openclose.BSD4_n.c«, »b_openclose.SYS_V.c«
└─⟦060c9c824⟧ Bits:30007080 DKUUG TeX 2/12/89 └─⟦this⟧ »./tex82/Unsupported/MFpxl/mflib/b_openclose.BSD4_n.c« └─⟦this⟧ »./tex82/Unsupported/MFpxl/mflib/b_openclose.SYS_V.c« └─⟦52210d11f⟧ Bits:30007239 EUUGD2: TeX 3 1992-12 └─⟦beba6c409⟧ »unix3.0/Unsupported.tar.Z« └─⟦25c524ae4⟧ └─⟦this⟧ »Unsupported/MFpxl/mflib/b_openclose.BSD4_n.c« └─⟦this⟧ »Unsupported/MFpxl/mflib/b_openclose.SYS_V.c«
#ifndef lint static char RCSid[] = "$Header: b_openclose.c,v 1.0.1.1 86/02/06 16:45:56 richards Released $"; #endif /* * Byte I/O utility routines: a compiler independent set of routines for * reading and writing byte files for the MF utilities * * function bopenin( * var f: bytefile; * var bname: packed array [] of UNIX_file_name_char; * pathsel: integer; * ): boolean; * { open the file whose name is in array bname } * { optionally searching using path "pathsel" } * { for input only; return true if open OK } * * function bopenout( * var f: bytefile; * var bname: packed array [] of UNIX_file_name_char * ): boolean; * { open the file whose name is in array bname } * { for input only; return true if open OK } * * procedure bclose(var f: bytefile); * { close open byte file F, flush output if needed } * * function beof(var f: bytefile): boolean; * { true if EOF condition exists on b file } * * function bfilelen(var f: bytefile): integer; * { returns size in bytes of open b file } * * function bfileloc(var f: bytefile): integer; * { returns current file offset in bytes } * * procedure bsetptr(var f: bytefile, var ptr: integer); * { saves address of variable "ptr" in bytefile } * { struct so it can be updated when accesses to } * { bytefile are made. (used to emulate cur_loc } * { used with original MF routines) } * * procedure bseek(var f: bytefile; n: integer); * { sets internal idea of "current byte position" } * { to n; next read will read starting at byte n } * * procedure bgetname( * var f: bytefile; * var name: packed array [] of UNIX_file_name_char; * ); * { obtains a copy of the name of file "f" } * { in "name" } * * */ #include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include "h00vars.h" #include "mftypes.h" /* * function bopenin( * var bf: bytefile; * var bname: array ...; * pathsel: integer ): boolean; * * returns true if open succeeds, else false * stores stdio file ptr in bf for use by * remainder of routines. Pathsel selects a path name * to use during input open, or 0 if no searching wanted */ bool bopenin(bf, bname, pathsel) register bytefile *bf; register UNIX_file_name_char *bname; integer pathsel; { char *pathp; extern char *path_select(); if (pathsel && (*bname != '/')) pathp = path_select(pathsel); else pathp = NULL; do { path_buildname(bname, bf->b_file_name, &pathp); if (bf->b_fp = fopen(bf->b_file_name, "r")) { bf->b_locptr = NULL; return(TRUE); } } while (pathp != NULL); bf->b_fp = NULL; bf->b_locptr = NULL; return(FALSE); } /* * function bopenout(var bf: bytefile, var bname: array ...): boolean; * * returns true if open succeeds, else false * stores stdio file ptr in bf for use by * remainder of routines. */ bool bopenout(bf, bname) bytefile *bf; register UNIX_file_name_char *bname; { register char *namep; register FILE *fp; namep = bf->b_file_name; /* skip over filename till first blank */ while ((*namep = *bname) != ' ') bname++, namep++; *namep = '\0'; if ((fp = fopen(bf->b_file_name, "w")) == NULL) { bf->b_fp = NULL; bf->b_locptr = 0; return(FALSE); } bf->b_fp = fp; bf->b_locptr = 0; return(TRUE); } /* * procedure bclose(var f: bytefile); * * flush output and close "f" */ void bclose(bf) bytefile *bf; { if (bf->b_fp) (void) fclose(bf->b_fp); bf->b_fp = NULL; bf->b_locptr = NULL; } /* * function beof(var f: bytefile): boolean; * * return true if EOF on byte file (also true if not open) */ bool beof(bf) bytefile *bf; { register FILE *fp = bf->b_fp; register int c; if ((fp == NULL) || (c = getc(fp)) == EOF) return (TRUE); (void) ungetc(c, fp); return (FALSE); } /* * function bfilelen(var bf: bytefile): integer; * * return length of open byte file in bytes */ integer bfilelen(bf) bytefile *bf; { register FILE *fp = bf->b_fp; struct stat bstat; if (fp == NULL || fstat(fileno(fp), &bstat)) return(0); return(bstat.st_size); } /* * function bfileloc(var bf: bytefile): integer; * * return current location of open byte file in bytes */ integer bfileloc(bf) bytefile *bf; { register FILE *fp = bf->b_fp; if (fp == NULL) return(0); return(ftell(fp)); } /* * procedure bsetptr(var bf: bytefile; var ptr: integer); * * save address of "ptr" in bytefile struct so whever we * read/write/seek on "bf", we can update the value in "ptr" * to follow. Emulates "cur_loc" update mechanism used * in MF. Note that these routines don't do anything to * the b_locptr field in "bf" unless we explicitly set * it up with this routine. */ void bsetptr(bf, ptr) bytefile *bf; integer *ptr; { bf->b_locptr = ptr; } /* * procedure bseek(var bf: bytefile;n: integer); * * moves "current-position" to n for reading */ void bseek(bf, n) bytefile *bf; integer n; { register FILE *fp = bf->b_fp; if (fp && (fseek(fp, (long)n, 0) == -1)) perror("bseek"); if (bf->b_locptr) *bf->b_locptr = n; } /* * procedure bgetname(var bf: bytefile; var name: packed array ...) * * provides a means to retrieve the name used to open a byte * file. copies it back from the bytefile structure into * whatever perverted data type Pascal stores characters in */ void bgetname(bf, name) bytefile *bf; register UNIX_file_name_char *name; { register char *cp; cp = bf->b_file_name; while (*name = *cp++) name++; *name++ = ' '; /* pascal likes space-terminated */ }