NAME

fget_line - Reads a line from a stream into a null terminated string.

SYNOPSIS

#include "l/l_sys_io.h"

Example compile flags (system dependent):
  -DLINUX_X86_64 -DLINUX_X86_64_OPTERON  -DGNU_COMPILER 
   -I/home/kobus/include
   -L/home/kobus/misc/load/linux_x86_64_opteron -L/usr/lib/x86_64-linux-gnu
  -lKJB                               -lfftw3  -lgsl -lgslcblas -ljpeg  -lSVM -lstdc++                    -lpthread -lSLATEC -lg2c    -lacml -lacml_mv -lblas -lg2c      -lncursesw 


long fget_line
(
	FILE *fp,
	char *line,
	size_t max_len
);

DESCRIPTION

This routine is similar to fgets(3C). It reads a null terminated string representing one line from the file/device represented by the parameter "fp" into the buffer pointed to by the parameter "line". The new line character is consumed but not returned. At most max_len characters are placed into "line" including the NULL. If there are more than max_len-1 characters on the line, the extra ones are purged, and a truncated version of the line is left in the buffer and TRUNCATED is returned. The maximum number of characters that can be read is also limited by an internal buffer. If the number of characters exceed the size of the internal buffer, then TRUNCATED is also returned. Since fget_line is intended for reading text, extremely long lines are not expected. The exact limit is given by GET_LINE_BUFF_SIZE which is defined in l_sys_io.h. An internal buffer is needed to get the proper behaviour on non-blocking reads. If the device corresponding to fp has been set non-blocking then this routine will return WOULD_BLOCK until an entire line can be returned. Similarly, if EOF is read before the new line is reached, then EOF is returned until an entire line can be read. Thus if a separate process is writing to a file, and this routine is used to read that file, then a loop on EOF will read the file by lines, which can simplify parsing. This function is not re-entrant (i.e., not thread-safe).

RETURNS

On success fget_line returns the number of bytes placed in the buffer, excluding the NULL. Since the new line chracter is consumed but not copied, zero is returned for null lines. Alternate return values are all negative. In the case of end of file, EOF returned. If the line was truncated, then TRUNCATED is returned. Depending on the signal traps and options in place, INTERRUPTED is an additional possible return value. In the case of non-blocking reads WOULD_BLOCK is returned unless a complete line can be returned. ERROR is returned for unexpected problems and an error message is set.

NOTE

Since the number of characters is limted by the internal buffer which is less than LONG_MAX, there will not be overflow in the return of the number of bytes. This routine is meant for reading relatively short ascii lines.

NOTE

The behaviour on non-blocking and EOF assumes that all calls in a sequence trying to read a given line are made with the same file pointer (there is only one buffer). This is only relavent for situations where one is actively waiting for additional input to arrive (due to some other process).

NOTE

This routine is not designed for performance. The assumption is that line at a time reads correspond to small amounts of I/O.

MACROS

BUFF_FGET_LINE(FILE fp, char line[]) The max_len parameter is set to sizeof(line) with the appropriate cast. Using sizeof to set the buffer size is recomended where applicable, as the code will not be broken if the buffer size changes. HOWEVER, neither this method, nor the macro, is applicable if line is NOT a character array. If line is declared by "char* line", then the size of line is the number of bytes in a character pointer (usually 8), which is NOT what is normally intended. You have been WARNED!

DISCLAIMER

This software is not adequatedly tested. It is recomended that results are checked independantly where appropriate.

AUTHOR

Kobus Barnard

DOCUMENTER

Kobus Barnard

SEE ALSO

set_low_level_io_options , kjb_read_exact , kjb_read , kjb_read_2 , safe_pipe_write , kjb_write , kjb_write_2 , kjb_fread_exact , kjb_fread , kjb_fread_2 , kjb_fwrite , kjb_fwrite_2 , kjb_safe_fflush , kjb_fflush , kjb_ioctl , set_blocking , set_no_blocking , stdin_get_line , dget_line , fput_line , kjb_mkdir , kjb_mkdir_2 , kjb_unlink , kjb_unlink_2 , kjb_rmdir , kjb_fopen , kjb_freopen , kjb_fdopen , kjb_fclose , kjb_realpath , get_fd_name , get_user_fd_name , kjb_fseek , kjb_ftell , kjb_fputs , kjb_fgetc , kjb_fputc , pso , p_stderr , kjb_fprintf , pdo , kjb_vfprintf , is_file , is_directory , fp_get_path_type , get_path_type , get_file_size , fp_get_byte_size , get_file_age , stream_younger , stream_older , get_file_mod_time , kjb_isatty , print_underlined , start_stdout_shadow , stop_stdout_shadow , start_stderr_shadow , stop_stderr_shadow , enable_stdout , disable_stdout , kjb_glob , kjb_simple_glob