FreeCalypso > hg > fc-sim-tools
comparison libutil/dbread.c @ 27:ca8a6f95826a
implemented sws-card-lookup and underlying libutil functions
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Tue, 16 Mar 2021 23:22:37 +0000 |
parents | |
children | fa81221ac9b6 |
comparison
equal
deleted
inserted
replaced
26:322f6fcdc36e | 27:ca8a6f95826a |
---|---|
1 /* | |
2 * This module implements functions for reading key=value database files. | |
3 */ | |
4 | |
5 #include <ctype.h> | |
6 #include <stdio.h> | |
7 #include <stdlib.h> | |
8 #include <string.h> | |
9 #include <strings.h> | |
10 #include "dbread.h" | |
11 | |
12 static | |
13 parse_read_line(dbs, filename_for_errs, lineno_for_errs) | |
14 struct dbread_state *dbs; | |
15 char *filename_for_errs; | |
16 int lineno_for_errs; | |
17 { | |
18 unsigned n; | |
19 char *cp, *np; | |
20 | |
21 n = 0; | |
22 for (cp = dbs->linebuf; ; ) { | |
23 while (isspace(*cp)) | |
24 cp++; | |
25 if (!*cp) | |
26 break; | |
27 if (*cp == '=') { | |
28 inv_syntax: fprintf(stderr, "%s line %d: invalid syntax\n", | |
29 filename_for_errs, lineno_for_errs); | |
30 return(-1); | |
31 } | |
32 for (np = cp; ; cp++) { | |
33 if (*cp == '=') | |
34 break; | |
35 if (!*cp || isspace(*cp)) | |
36 goto inv_syntax; | |
37 } | |
38 *cp++ = '\0'; | |
39 if (n >= DBREAD_MAX_KV_PAIRS) { | |
40 fprintf(stderr, | |
41 "%s line %d: too many key=value pairs\n", | |
42 filename_for_errs, lineno_for_errs); | |
43 return(-1); | |
44 } | |
45 dbs->kv_pairs[n].key = np; | |
46 dbs->kv_pairs[n].value = cp; | |
47 n++; | |
48 while (*cp && !isspace(*cp)) | |
49 cp++; | |
50 if (*cp) | |
51 *cp++ = '\0'; | |
52 } | |
53 dbs->num_kv_pairs = n; | |
54 return(0); | |
55 } | |
56 | |
57 char * | |
58 dbread_find_key(dbs, sought_key) | |
59 struct dbread_state *dbs; | |
60 char *sought_key; | |
61 { | |
62 unsigned n; | |
63 | |
64 for (n = 0; n < dbs->num_kv_pairs; n++) | |
65 if (!strcasecmp(dbs->kv_pairs[n].key, sought_key)) | |
66 return dbs->kv_pairs[n].value; | |
67 return 0; | |
68 } | |
69 | |
70 dbread_find_record(filename, dbs, sought_key, sought_value) | |
71 char *filename, *sought_key, *sought_value; | |
72 struct dbread_state *dbs; | |
73 { | |
74 FILE *inf; | |
75 int lineno; | |
76 char *cp; | |
77 | |
78 inf = fopen(filename, "r"); | |
79 if (!inf) { | |
80 perror(filename); | |
81 return(-1); | |
82 } | |
83 for (lineno = 1; fgets(dbs->linebuf, DBREAD_LINEBUF_SIZE, inf); | |
84 lineno++) { | |
85 if (!index(dbs->linebuf, '\n')) { | |
86 fprintf(stderr, | |
87 "%s line %d: too long or missing newline\n", | |
88 filename, lineno); | |
89 fclose(inf); | |
90 return(-1); | |
91 } | |
92 if (parse_read_line(dbs, filename, lineno) < 0) { | |
93 /* error msg already printed */ | |
94 fclose(inf); | |
95 return(-1); | |
96 } | |
97 cp = dbread_find_key(dbs, sought_key); | |
98 if (!cp) | |
99 continue; | |
100 if (strcmp(cp, sought_value)) | |
101 continue; | |
102 /* found our record: struct dbread_state is our return */ | |
103 fclose(inf); | |
104 return(0); | |
105 } | |
106 fclose(inf); | |
107 fprintf(stderr, "error: %s=%s not found in %s\n", sought_key, | |
108 sought_value, filename); | |
109 return(-1); | |
110 } |