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 >
C/C++ Source or Header  |  1992-06-13  |  3KB  |  131 lines

  1. /* libfile.c: open and read a single auxiliary data file.
  2.  
  3. Copyright (C) 1992 Free Software Foundation, Inc.
  4.  
  5. This program is free software; you can redistribute it and/or modify
  6. it under the terms of the GNU General Public License as published by
  7. the Free Software Foundation; either version 2, or (at your option)
  8. any later version.
  9.  
  10. This program is distributed in the hope that it will be useful,
  11. but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13. GNU General Public License for more details.
  14.  
  15. You should have received a copy of the GNU General Public License
  16. along with this program; if not, write to the Free Software
  17. Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
  18.  
  19. #include "config.h"
  20. #include "paths.h"
  21.  
  22. #include <ctype.h>
  23. #include "libfile.h"
  24. #include "line.h"
  25. #include "pathsrch.h"
  26.  
  27.  
  28. /* Private variables to hold the auxiliary file we're reading from, and
  29.    its name.  */ 
  30. static FILE *lib_file = NULL;
  31. static string lib_filename;
  32. static unsigned lib_file_line_number;
  33.  
  34.  
  35. /* Prepare to read the ``library file'' FILENAME.DEFAULT_SUFFIX (if
  36.    FILENAME has no suffix), or just FILENAME (if it has).  Give a fatal
  37.    error if it cannot be opened.  Return the resulting FILE * (although
  38.    usually this will just be ignored by the caller).  */
  39.  
  40. FILE *
  41. libfile_start (string filename, string default_suffix)
  42. {
  43.   string *lib_dirs = initialize_path_list (LIB_ENVVAR, DEFAULT_LIB_PATH);
  44.   string name = extend_filename (filename, default_suffix);
  45.  
  46.   lib_filename = find_path_filename (name, lib_dirs);
  47.  
  48.   if (lib_filename == NULL)
  49.     FATAL1 ("%s: Cannot find library file in path", name);
  50.  
  51.   lib_file = xfopen (lib_filename, "r");
  52.   lib_file_line_number = 1;
  53.   
  54.   return lib_file;
  55. }
  56.  
  57.  
  58. /* Close our current open file.  If we don't have any file open, give a
  59.    fatal error.  */
  60.  
  61. void
  62. libfile_close ()
  63. {
  64.   assert (lib_file != NULL);
  65.   
  66.   fclose (lib_file);
  67.   lib_file = NULL;
  68. }
  69.  
  70. /* Return the name of the currently open file, or NULL if none.  */
  71.  
  72. string
  73. libfilename ()
  74. {
  75.   return lib_file == NULL ? NULL : lib_filename;
  76. }
  77.  
  78.  
  79. /* Analogously, for the current line number.  */
  80.  
  81. unsigned
  82. libfile_linenumber ()
  83. {
  84.   return lib_file == NULL ? 0 : lib_file_line_number;
  85. }
  86.  
  87. /* Return the next nonblank non-comment line from `lib_file', or NULL if
  88.    we are at EOF.  Also remove any trailing comment on the line.  */
  89.  
  90. string
  91. libfile_line ()
  92. {
  93.   string s;
  94.   string line;
  95.   boolean skip = true;
  96.   
  97.   assert (lib_file != NULL);
  98.  
  99.   do
  100.     {
  101.       line = read_line (lib_file);
  102.       lib_file_line_number++;
  103.       
  104.       /* If at EOF, quit the loop.  */
  105.       if (line == NULL)
  106.         break;
  107.  
  108.       s = line;
  109.       
  110.       /* Move ahead to the first nonblank character.  */
  111.       while (*s != 0 && isspace (*s))
  112.         s++;
  113.  
  114.      /* Keep going if the line was blank or a comment.  */
  115.       if (*s == 0 || *s == '%')
  116.         free (line);
  117.       else
  118.         skip = false;
  119.     }
  120.   while (skip);
  121.   
  122.   if (line != NULL)
  123.     {
  124.       s = strrchr (line, '%');
  125.       if (s != NULL)
  126.         *s = 0;
  127.     }
  128.  
  129.   return line;
  130. }
  131.