ftp.nice.ch/pub/next/developer/languages/ada/Adaed.1.11.s.tar.gz#/Adaed-1.11.0a/libf.c

This is libf.c in view mode; [Download] [Up]

/*
 * Copyright (C) 1985-1992  New York University
 * 
 * This file is part of the Ada/Ed-C system.  See the Ada/Ed README file for
 * warranty (none) and distribution info and also the GNU General Public
 * License for more details.

 */

/* libf - auxiliary procedures for reading in IFILE format files.
 * This is subset of procedures needed to read files generated in
 * library format without the need all the library primitives.
 */

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "config.h"
#include "ifile.h"
#include "miscprots.h"
#include "libfprots.h"
#ifndef TRUE
#define TRUE 1
#endif

#ifdef DEBUG
#define IOT
#endif

/* iot_opt_number is set to give file numbers for traces*/
static int iot_opt_number = TRUE;
static int iot_opt_desc = TRUE;
static int iot_off_trace = TRUE; /* set to trace file positions */

void iot_off_info(int lev)									/*;iot_off_info*/
{
	iot_off_trace = lev;
}

int getint(IFILE *ifile, char *desc)							/*;getint*/
{
	/* read int  from input file */
	int si;
	int n = 0;
	int	nr;

#ifdef IOT
	if (ifile->fh_trace == 2) iot_info(ifile, desc);
#endif
#ifdef HI_LEVEL_IO
	nr = fread((char *) &si, sizeof(int), 1, ifile->fh_file);
	if (nr != 1) {
#else
	nr = read(ifile->fh_file, (char *) &si, sizeof(int));
	if (nr != sizeof(int)) {
#endif
		chaos("libr.c: read_ais - unable to read int value");
	}
	n = si;
#ifdef IOT
	if (ifile->fh_trace == 2) printf(" (int) %ld\n", n);
#endif
	return n;
}

int getnum(IFILE *ifile, char *desc)								/*;getnum*/
{
	/* read integer (only 2 bytes) from input file */

	short si;
	int n = 0;

#ifdef IOT
	if (ifile->fh_trace == 2) iot_info(ifile, desc);
#endif
#ifdef HI_LEVEL_IO
	fread((char *) &si, sizeof(short), 1, ifile->fh_file);
#else
	read(ifile->fh_file, (char *) &si, sizeof(short));
#endif
	n = si;
#ifdef IOT
	if (ifile->fh_trace == 2) printf(" %d\n", n);
#endif
	return n;
}

int getchr(IFILE *ifile, char *desc)								/*;getchr*/
{
	/* This is variant of getnum used when reading character values */
	/* read integer (only 2 bytes) from input file */

	short si;
	int n = 0;

#ifdef IOT
	if (ifile->fh_trace == 2) iot_info(ifile, desc);
#endif
#ifdef HI_LEVEL_IO
	fread((char *) &si, sizeof(short), 1, ifile->fh_file);
#else
	read(ifile->fh_file, (char *) &si, sizeof(short));
#endif
	n = si;
#ifdef IOT
	if (ifile->fh_trace == 2) printf(" %d %c\n", n, (char)n);
#endif
	return n;
}

long getlong(IFILE *ifile, char *desc)							/*;getlong*/
{
	/* read long  from input file */

	long si;
	long n = 0;
	int	nr;

#ifdef IOT
	if (ifile->fh_trace == 2) iot_info(ifile, desc);
#endif

#ifdef HI_LEVEL_IO
	nr = fread((char *) &si, sizeof(long), 1, ifile->fh_file);
	if (nr != 1) {
#else
	nr = read(ifile->fh_file, (char *) &si, sizeof(long));
	if (nr != sizeof(long)) {
#endif
		chaos("libr.c: read_ais - unable to read long value");
	}
	n = si;
#ifdef IOT
	if (ifile->fh_trace == 2) printf(" (long) %ld\n", n);
#endif
	return n;
}

char *getstr(IFILE *ifile, char *desc)							/*;getstr*/
{
	char	*s, *p;
	int		n, i;

#ifdef IOT
	if (ifile->fh_trace == 1) printf("getstr(ifile, )\n");
	if (ifile->fh_trace == 2) iot_info(ifile, "str");
#endif
	n = getnum(ifile, "");
	if (n == 0) return (char *)0;
	s = (char *) smalloc((unsigned) n);
	p = s;
	for (i = 1; i < n; i++) {
#ifdef HI_LEVEL_IO
		*p++ = getc(ifile->fh_file);
#else
		read(ifile->fh_file, p++, 1);
#endif
	}
	*p = '\0'; /* set end of string*/

#ifdef IOT
	if (ifile->fh_trace == 2) printf("%s\n", s);
#endif
	return s;
}

#ifdef IOT
void iot_info(IFILE *ifile, char *s)							/*;iot_info*/
{
	long pos;

	if (ifile->fh_trace<2) return;
	if (strlen(s) == 0) return; /* skip if null string */
	pos = iftell(ifile);
	if (iot_opt_desc) printf("%s ", s);
	if (iot_opt_number) printf("%d", ifile->fh_number);
	printf("%c", ifile->fh_type);
	if (iot_off_trace) printf("=%ld", pos);
	printf(" ");
}
#endif

long read_init(IFILE *ifile)								/*;read_init*/
{
	/* initialize read, position at start of first record, return
	 * offset of next record. return 0 if no first first record.
	 * read first word in file that may have offset to slot info.
	 */

	long  pos, start;
	int   nr;

	if (ifile->fh_trace>1) start = iftell(ifile);
#ifdef HI_LEVEL_IO
	nr = fread((char *) &pos, sizeof(long), 1, ifile->fh_file);
	if (nr != 1) {
#else
	nr = read(ifile->fh_file, (char *) &pos, sizeof(long));
	if (nr != sizeof(long)) {
#endif
		/* temporary fix: permit read_init to fail for stub files ds 11-15*/
		if (ifile->fh_type == 's') return 0;
		chaos("read_init read failed ");
		return 0;
	}
#ifdef IOT
	if (ifile->fh_trace>1) printf("read_init at %ld got %ld\n", start, pos);
#endif
	return pos;
}

long read_next(IFILE *ifile, long p)						/*;read_next*/
{
	int	 nr;
	long  pos;

	ifseek(ifile, "next-unit", p, 0);
	if (p == ifile->fh_units_end) {
#ifdef IOT
		if (ifile->fh_trace) printf("read_next units_end reached %ld\n", p);
#endif
		return 0; /* if at end */
	}
#ifdef HI_LEVEL_IO
	nr = fread((char *) &pos, sizeof(long), 1, ifile->fh_file);
	if (nr != 1) {
#else
	nr = read(ifile->fh_file, (char *) &pos, sizeof(long));
	if (nr != sizeof(long)) {
#endif
		chaos("read_next read failure");
		return 0;
	}
	return pos;
}

void iot_set_opt_number(int val)					/*;iot_set_opt_number*/
{
	/* set status of fnumber flag that when on causes internal file number
	 * to be include in trace output
	 */
	iot_opt_number = val;
}

void iot_set_opt_desc(int val)						/*;iot_set_opt_desc*/
{
	/* set status of fnumber flag that when on causes internal file number
	 * to be include in trace output
	 */
	iot_opt_desc = val;
}

void putnum(IFILE *ofile, char *desc, int n)						/*;putnum*/
{
	/* write integer (as a short) to output file */

	short s;
	s = n;

#ifdef IOT
	if (ofile->fh_trace > 1) {
		iot_info(ofile, desc);
		printf(" %d\n", n);
	}
#endif
#ifdef HI_LEVEL_IO
	fwrite((char *) &s, sizeof(short), 1, ofile->fh_file);
#else
	write(ofile->fh_file, (char *) &s, sizeof(short));
#endif
}

void putpos(IFILE *ofile, char *desc, int n)					/*;putpos*/
{
	/* like putnum, but verifies that argument positive */
	/* write integer (as a short) to output file */

	if (n < 0) chaos("putpos: negative argument");
	putnum(ofile, desc, n);
}

void putstr(IFILE *ofile, char *desc, char *s)					/*;putstr*/
{
	if (s == (char *)0) {
#ifdef IOT
		if (ofile->fh_trace>1) iot_info(ofile, desc);
#endif
		putnum(ofile, "", 0);
	}
	else {
#ifdef IOT
		if (ofile->fh_trace>1) iot_info(ofile, desc);
#endif
		putnum(ofile, "", strlen(s)+1);
#ifdef IOT
		if (ofile->fh_trace>1) printf("%s\n", s);
#endif
#ifdef HI_LEVEL_IO
		fputs(s, ofile->fh_file);
#else
		write(ofile->fh_file, s, strlen(s));
#endif
	}
}

void putchr(IFILE *ofile, char *desc, int n)					/*;putchr*/
{
	/* variant of putnum used when writing character value */
	/* write integer (as a short) to output file */

	short s = n;

#ifdef IOT
	if (ofile->fh_trace>1) {
		iot_info(ofile, desc);
		printf(" %d %c\n", n, n);
	}
#endif
#ifdef HI_LEVEL_IO
	fwrite((char *) &s, sizeof(short), 1, ofile->fh_file);
#else
	write(ofile->fh_file, (char *) &s, sizeof(short));
#endif
}

These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.