Basic file handling


Data structures

File operations use a file_info-structure defined as below:
struct file_info {
  char *name;
  FILE *fp;
  struct {
    unsigned int compressed : 1; /* is the file compressed */
    unsigned int pipe : 1;       /* the file is a pipe */
    unsigned int eof : 1;        /* has end of line been reached */
  } flags;
  int error;                     /* error code or 0 if OK */
  long lineno;                   /* line number we are on */
};
The fields of the structure are:
Name
Used to store the file name
Fp
A FILE pointer to the file. You can use the fi2fp() macro to get the FILE pointer from the structure.
Error
Error number or 0 if OK.
Lineno
Line number of the current line. Updated when reading a file line by line with the getline function.
Flags
Currently defined flags are:
Compressed
File is compressed. Implies that it is a pipe too.
Pipe
The file is a pipe. Can be a compressed file, a piped command or standard input from/to a pipe.
Eof
True if end of file has been encountered. Reset when file is rewinded.

Functions

struct file_info *open_file(char *name, char *fmode);
int close_file(struct file_info *fi);
char *getline(struct file_info *fi);
struct file_info *open_file(char *name, char *fmode)
Open a file for reading or writing. If name is NULL or '-', uses standard input or output. Allowed characters in fmode are 'r' for reading, 'w' for writing, 'z' for compressed files and 'p' for piping output/input to/from a command (name is command string). 'p' and 'z' are not required in the fmode because they can be guessed from the filename: if the name and with the suffix .gz, .z or .Z the z-mode is assumed. If the name starts with the unix pipe character '|', the p-mode is assumed and the rest of the name is used as the command to be run.

If the file opening is successful, a pointer to a file_info-structure is returned. On error NULL is returned.

int close_file(struct file_info *fi)
Closes the file fi.

char *getline(struct file_info *fi)
Reads one line from file fi and returns a pointer to the line. The pointer returned points to a private buffer of the getline function so the next getline call will destroy the previous line. Make a copy of the line if you need it. Getline can handle lines of up to ABS_STR_LNG characters (defined in fileio.h or config.h).

Getline returns NULL when EOF is reached or an error occurs. The error and eof flags in fi are set accordingly.

int rewind_file(struct file_info *fi)
Goes to the beginning of file. If file is an ordinary file, seeks to the start of file. If the file is a compressed file, closes the old file and runs the uncompressing command again. Returns 0 on success, error code otherwise.