File: fileio.h

package info (click to toggle)
tworld 1.3.0-1
  • links: PTS
  • area: main
  • in suites: etch, etch-m68k
  • size: 6,600 kB
  • ctags: 1,403
  • sloc: ansic: 12,442; perl: 2,465; makefile: 165; sh: 9
file content (147 lines) | stat: -rw-r--r-- 5,730 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
/* fileio.h: Simple file/directory access functions with error-handling.
 *
 * Copyright (C) 2001-2006 by Brian Raiter, under the GNU General Public
 * License. No warranty. See COPYING for details.
 */

#ifndef	_fileio_h_
#define	_fileio_h_

#include	"defs.h"

/* Reset a fileinfo structure to indicate no file.
 */
extern void clearfileinfo(fileinfo *file);

/* Open a file. If the fileinfo structure does not already have a
 * filename assigned to it, name will be used as the filename. If msg
 * is NULL, no error will be displayed if the file cannot be opened.
 * If msg points to a string, an error will be displayed. The text of
 * msg will be used only if errno is zero; otherwise a message
 * appropriate to the error will be used.
 */
extern int fileopen(fileinfo *file, char const *name, char const *mode,
		    char const *msg);

/* The following functions correspond directly to C's standard I/O
 * functions. The extra msg parameter works as described above for
 * fileopen().
 */
extern int filerewind(fileinfo *file, char const *msg);
extern int filegetpos(fileinfo *file, fpos_t *pos, char const *msg);
extern int filesetpos(fileinfo *file, fpos_t *pos, char const *msg);
extern int fileread(fileinfo *file, void *data, unsigned long size,
		    char const *msg);
extern int filewrite(fileinfo *file, void const *data, unsigned long size,
		     char const *msg);
extern void fileclose(fileinfo *file, char const *msg);

/* fileskip() works like fseek() with whence set to SEEK_CUR.
 */
extern int fileskip(fileinfo *file, int offset, char const *msg);

/* filetestend() forces a check for EOF by attempting to read a byte
 * from the file, and ungetting the byte if one is successfully read.
 */
extern int filetestend(fileinfo *file);

/* The following functions read and write an unsigned integer value
 * from the current position in the given file. For the multi-byte
 * values, the value is assumed to be stored in little-endian.
 */
extern int filereadint8(fileinfo *file, unsigned char *val8,
			char const *msg);
extern int filewriteint8(fileinfo *file, unsigned char val8,
			 char const *msg);
extern int filereadint16(fileinfo *file, unsigned short *val16,
			 char const *msg);
extern int filewriteint16(fileinfo *file, unsigned short val16,
			  char const *msg);
extern int filereadint32(fileinfo *file, unsigned long *val32,
			 char const *msg);
extern int filewriteint32(fileinfo *file, unsigned long val32,
			  char const *msg);

/* Read size bytes from the given file and return the bytes in a
 * newly allocated buffer.
 */
extern void *filereadbuf(fileinfo *file, unsigned long size, char const *msg);

/* Read one full line from fp and store the first len characters,
 * including any trailing newline. len receives the length of the line
 * stored in buf, minus any trailing newline, upon return.
 */
extern int filegetline(fileinfo *file, char *buf, int *len, char const *msg);

/* Read a config-style line from a file, looking for the pattern
 * "name=value". FALSE is returned if the end of the file is found
 * first.
 */
extern int filegetconfigline(fileinfo *file, char **name, char **value,
			     char const *msg);

/* Return the maximum size of a legal pathname.
 */
extern int getpathbufferlen(void);

/* Return an allocated buffer big enough to hold any legal pathname.
 */
extern char *getpathbuffer(void);

/* Return TRUE if name contains a path but is not a directory itself.
 */
extern int haspathname(char const *name);

/* Return a pointer to the filename, skipping over any directories in
 * the front.
 */
extern char *skippathname(char const *name);

/* Append the path and/or file contained in path to dir, storing the
 * result in dest. dest and dir can point to the same buffer. dest is
 * assumed to be a buffer of size getpathbufferlen(). If the resulting
 * path is longer than this, FALSE is returned and errno is set to
 * ENAMETOOLONG.
 */
extern int combinepath(char *dest, char const *dir, char const *path);

/* Return the pathname for a directory and/or filename, using the same
 * algorithm to construct the path as openfileindir(). The caller must
 * free the returned buffer.
 */
extern char *getpathforfileindir(char const *dir, char const *filename);

/* Verify that the given directory exists, or create it if it doesn't.
 */
extern int finddir(char const *dir);

/* Open a file, using dir as the directory if filename is not already
 * a complete pathname. FALSE is returned if the directory could not
 * be created.
 */
extern int openfileindir(fileinfo *file, char const *dir, char const *filename,
			 char const *mode, char const *msg);

/* Call filecallback once for every file in dir. The first argument to
 * the callback function is an allocated buffer containing the
 * filename. data is passed as the second argument to the callback. If
 * the callback's return value is zero, the buffer is deallocated
 * normally; if the return value is positive, the callback function
 * inherits the buffer and the responsibility of freeing it. If the
 * return value is negative, findfiles() stops scanning the directory
 * and returns. FALSE is returned if the directory could not be
 * examined.
 */
extern int findfiles(char const *dir, void *data,
		     int (*filecallback)(char*, void*));

/* Display a simple error message prefixed by the name of the given
 * file. If errno is set, a message appropriate to the value is used;
 * otherwise the text pointed to by msg is used. If msg is NULL, the
 * function does nothing. The return value is always FALSE.
 */
extern int _fileerr(char const *cfile, unsigned long lineno,
		    fileinfo *file, char const *msg);
#define	fileerr(file, msg)	(_fileerr(__FILE__, __LINE__, (file), (msg)))

#endif