home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Geek Gadgets 1
/
ADE-1.bin
/
ade-dist
/
fontutils-0.6-base.tgz
/
fontutils-0.6-base.tar
/
fsf
/
fontutils
/
lib
/
libfile.c
< prev
next >
Wrap
C/C++ Source or Header
|
1992-06-13
|
3KB
|
131 lines
/* libfile.c: open and read a single auxiliary data file.
Copyright (C) 1992 Free Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
#include "config.h"
#include "paths.h"
#include <ctype.h>
#include "libfile.h"
#include "line.h"
#include "pathsrch.h"
/* Private variables to hold the auxiliary file we're reading from, and
its name. */
static FILE *lib_file = NULL;
static string lib_filename;
static unsigned lib_file_line_number;
/* Prepare to read the ``library file'' FILENAME.DEFAULT_SUFFIX (if
FILENAME has no suffix), or just FILENAME (if it has). Give a fatal
error if it cannot be opened. Return the resulting FILE * (although
usually this will just be ignored by the caller). */
FILE *
libfile_start (string filename, string default_suffix)
{
string *lib_dirs = initialize_path_list (LIB_ENVVAR, DEFAULT_LIB_PATH);
string name = extend_filename (filename, default_suffix);
lib_filename = find_path_filename (name, lib_dirs);
if (lib_filename == NULL)
FATAL1 ("%s: Cannot find library file in path", name);
lib_file = xfopen (lib_filename, "r");
lib_file_line_number = 1;
return lib_file;
}
/* Close our current open file. If we don't have any file open, give a
fatal error. */
void
libfile_close ()
{
assert (lib_file != NULL);
fclose (lib_file);
lib_file = NULL;
}
/* Return the name of the currently open file, or NULL if none. */
string
libfilename ()
{
return lib_file == NULL ? NULL : lib_filename;
}
/* Analogously, for the current line number. */
unsigned
libfile_linenumber ()
{
return lib_file == NULL ? 0 : lib_file_line_number;
}
/* Return the next nonblank non-comment line from `lib_file', or NULL if
we are at EOF. Also remove any trailing comment on the line. */
string
libfile_line ()
{
string s;
string line;
boolean skip = true;
assert (lib_file != NULL);
do
{
line = read_line (lib_file);
lib_file_line_number++;
/* If at EOF, quit the loop. */
if (line == NULL)
break;
s = line;
/* Move ahead to the first nonblank character. */
while (*s != 0 && isspace (*s))
s++;
/* Keep going if the line was blank or a comment. */
if (*s == 0 || *s == '%')
free (line);
else
skip = false;
}
while (skip);
if (line != NULL)
{
s = strrchr (line, '%');
if (s != NULL)
*s = 0;
}
return line;
}