ngspice/src/xspice/cmpp/file_buffer.h

59 lines
2.1 KiB
C

#ifndef file_buffer_h_included
#define file_buffer_h_included
#include <stdbool.h>
/* Null-terminated string prefixed by length excluding null */
typedef struct Filebuf_len_str {
size_t n_char; /* length of string excluding null termination */
char *sz; /* Start of string */
} FBSTRING;
/* Union for returned value */
typedef union Filebuf_obj {
FBSTRING str_value;
unsigned long ulong_value;
long long_value;
double dbl_value;
} FBOBJ;
/* Structure for getting file data */
typedef struct Filebuf {
FILE *fp; /* handle to file */
bool is_eof; /* flag that EOF reached */
bool f_skip_to_eol;
/* Flag that text until the next EOL character should be
* skipped before getting the next item from the buffer.
* This flag is set when a comment terminates an item,
* such as "abc# This is a comment." */
size_t n_byte_buf_alloc; /* Allocated buffer size */
char *p_buf; /* buffer to receive data from file */
char *p_obj_start; /* start of object being returned */
char *p_obj_end; /* byte past object being returned */
char *p_data_cur; /* current position in buffer. Depending on
* circumstances, it points to either the character
* being processed or the next character to process */
char *p_data_end; /* byte past end of data in buffer */
char *p_buf_end; /* byte past end of allocated buffer size, equal to
* p_buf + n_byte_buf_alloc, so it is redundant, but
* convenient to have available */
} FILEBUF;
/* Types of data */
typedef enum FBtype {
BUF_TYPE_STRING, /* value type string (always possible) */
BUF_TYPE_ULONG, /* value type an unsigned int */
BUF_TYPE_LONG, /* value type an int */
BUF_TYPE_DOUBLE /* value type double */
} FBTYPE;
FILEBUF *fbopen(const char *filename, size_t n_byte_buf_init);
int fbget(FILEBUF *p_fb, unsigned int n_type_wanted, FBTYPE *p_type_wanted,
FBTYPE *p_type_found, FBOBJ *p_fbobj);
int fbclose(FILEBUF *fbp);
#endif /* include guard */