1 /* An input parsing abstraction: an input buffer (file, stream, etc.)
2  */
3 #ifndef eslBUFFER_INCLUDED
4 #define eslBUFFER_INCLUDED
5 #include "esl_config.h"
6 
7 #include <stdio.h>
8 
9 #define eslBUFFER_PAGESIZE      4096    /* default for b->pagesize                       */
10 #define eslBUFFER_SLURPSIZE  4194304	/* switchover from slurping whole file to mmap() */
11 
12 enum esl_buffer_mode_e {
13   eslBUFFER_UNSET   = 0,
14   eslBUFFER_STREAM  = 1,  /* chunk in mem[0..n-1] = input[baseoffset..baseoffset-n-1];  balloc>0; offset>=0; fp open  */
15   eslBUFFER_CMDPIPE = 2,  /* chunk in mem[0..n-1] = input[baseoffset..baseoffset-n-1];  balloc>0; offset>=0; fp open  */
16   eslBUFFER_FILE    = 3,  /* chunk in mem[0..n-1] = input[baseoffset..baseoffset-n-1];  balloc>0; offset>=0; fp open  */
17   eslBUFFER_ALLFILE = 4,  /* whole file in mem[0..n-1];  balloc=0; offset=0;  fp=NULL  */
18   eslBUFFER_MMAP    = 5,  /* whole file in mem[0..n-1];  balloc=0; offset=0;  fp=NULL  */
19   eslBUFFER_STRING  = 6   /* whole str in mem[0..n-1];   balloc=0; offset=0;  fp=NULL  */
20 };
21 
22 typedef struct {
23   char      *mem;	          /* the buffer                                            */
24   esl_pos_t  n;		          /* curr buf length; mem[0..n-1] contains valid bytes     */
25   esl_pos_t  balloc;              /* curr buf alloc;  mem[0..balloc-1] may be used         */
26   esl_pos_t  pos;	          /* curr buf parse position; n-pos = # of parseable bytes */
27   esl_pos_t  baseoffset;          /* offset of byte mem[0] in the stream                   */
28 
29   esl_pos_t  anchor;	          /* buf[anchor..n-1] safe from overwrite [-1=unset]       */
30   int        nanchor;		  /* number of anchors set at <anchor>                     */
31 
32   FILE      *fp;	          /* open stream; NULL if already entirely in memory       */
33   char      *filename;	          /* for diagnostics. filename; or NULL (stdin, string)    */
34   char      *cmdline;		  /* for diagnostics. NULL, or cmd for CMDPIPE             */
35 
36   esl_pos_t  pagesize;	          /* size of new <fp> reads. Guarantee: n-pos >= pagesize  */
37 
38   char     errmsg[eslERRBUFSIZE]; /* error message storage                                 */
39   enum esl_buffer_mode_e mode_is; /* mode (stdin, cmdpipe, file, allfile, mmap, string)    */
40 } ESL_BUFFER;
41 
42 
43 /* 1. The ESL_BUFFER object: opening/closing.  */
44 extern int esl_buffer_Open      (const char *filename, const char *envvar, ESL_BUFFER **ret_bf);
45 extern int esl_buffer_OpenFile  (const char *filename,                     ESL_BUFFER **ret_bf);
46 extern int esl_buffer_OpenPipe  (const char *filename, const char *cmdfmt, ESL_BUFFER **ret_bf);
47 extern int esl_buffer_OpenMem   (const char *p,         esl_pos_t  n,      ESL_BUFFER **ret_bf);
48 extern int esl_buffer_OpenStream(FILE *fp,                                 ESL_BUFFER **ret_bf);
49 extern int esl_buffer_Close(ESL_BUFFER *bf);
50 
51 /* 2. Positioning and anchoring an ESL_BUFFER. */
52 extern esl_pos_t esl_buffer_GetOffset      (ESL_BUFFER *bf);
53 extern int       esl_buffer_SetOffset      (ESL_BUFFER *bf, esl_pos_t offset);
54 extern int       esl_buffer_SetAnchor      (ESL_BUFFER *bf, esl_pos_t offset);
55 extern int       esl_buffer_SetStableAnchor(ESL_BUFFER *bf, esl_pos_t offset);
56 extern int       esl_buffer_RaiseAnchor    (ESL_BUFFER *bf, esl_pos_t offset);
57 
58 /* 3. Raw access to the buffer */
59 extern int esl_buffer_Get(ESL_BUFFER *bf, char **ret_p, esl_pos_t *ret_n);
60 extern int esl_buffer_Set(ESL_BUFFER *bf, char  *p,     esl_pos_t  nused);
61 
62 /* 4. Line-based parsing */
63 extern int esl_buffer_GetLine       (ESL_BUFFER *bf, char **opt_p, esl_pos_t *opt_n);
64 extern int esl_buffer_FetchLine     (ESL_BUFFER *bf, char **opt_p, esl_pos_t *opt_n);
65 extern int esl_buffer_FetchLineAsStr(ESL_BUFFER *bf, char **opt_s, esl_pos_t *opt_n);
66 
67 /* 5. Token-based parsing */
68 extern int esl_buffer_GetToken       (ESL_BUFFER *bf, const char *sep, char **opt_p, esl_pos_t *opt_n);
69 extern int esl_buffer_FetchToken     (ESL_BUFFER *bf, const char *sep, char **opt_p, esl_pos_t *opt_n);
70 extern int esl_buffer_FetchTokenAsStr(ESL_BUFFER *bf, const char *sep, char **opt_p, esl_pos_t *opt_n);
71 
72 /* 6. Binary (fread-like) parsing */
73 extern int esl_buffer_Read(ESL_BUFFER *bf, size_t nbytes, void *p);
74 
75 
76 
77 /* Replaces functionality of esl_fileparser module as follows
78  *
79  *  esl_fileparser_Open()             -> esl_buffer_Open()
80  *  esl_fileparser_Create()           -> esl_buffer_OpenStream()
81  *  esl_fileparser_CreateMapped()     -> esl_buffer_OpenMem()
82  *  esl_fileparser_SetCommentChar()   -> esl_buffer_SetCommentChar()
83  *  esl_fileparser_GetToken()         -> esl_buffer_GetToken()
84  *  esl_fileparser_NextLine()         -> do { esl_buffer_GetLine() } while esl_line_IsBlank();
85  *  esl_fileparser_NextLinePeeked()   -> unneeded. esl_buffer_Peek*() functionality, syntax different
86  *  esl_fileparser_GetTokenOnLine()   -> unneeded. esl_buffer_GetToken() has an idiom.
87  *  esl_fileparser_GetRemainingLine() -> esl_buffer_GetLine()
88  *  esl_fileparser_Destroy()          -> esl_buffer_Close()
89  *  esl_fileparser_Close()            -> esl_buffer_Close()
90  */
91 
92 /* Replaces functionality of esl_recorder module as follows:
93  *
94  *  esl_recorder_Create()             -> esl_buffer_OpenStream()
95  *  esl_recorder_ResizeTo()
96  *  esl_recorder_GetFirst()           ->
97  *  esl_recorder_GetLast()            ->
98  *  esl_recorder_GetCurrent()         ->
99  *  esl_recorder_GetNext()            ->
100  *  esl_recorder_Destroy()            -> esl_buffer_Close()
101  *  esl_recorder_Read()               -> esl_buffer_GetLine()
102  *  esl_recorder_Position()
103  *  esl_recorder_MarkBlock()
104  *  esl_recorder_UnmarkBlock()
105  *  esl_recorder_GetBlock()
106  *
107  */
108 
109 #endif	/*eslBUFFER_INCLUDED*/
110