Lines Matching refs:db
60 static void rnn_err(struct rnndb *db, const char *format, ...) _util_printf_format(2, 3);
62 static void rnn_err(struct rnndb *db, const char *format, ...)
68 db->estatus = 1;
77 struct rnndb *db = calloc(sizeof *db, 1);
78 return db;
111 static char *getattrib (struct rnndb *db, char *file, int line, xmlAttr *attr) {
115 rnn_err(db, "%s:%d: unknown attribute child \"%s\" in attribute \"%s\"\n", file, line, chain->name, attr->name);
124 static int getboolattrib (struct rnndb *db, char *file, int line, xmlAttr *attr) {
125 char *c = getattrib(db, file, line, attr);
130 rnn_err(db, "%s:%d: invalid boolean value \"%s\" in attribute \"%s\"\n", file, line, c, attr->name);
134 static uint64_t getnum(struct rnndb *db, char *file, int line, xmlAttr *attr, char *c)
143 rnn_err(db, "%s:%d: invalid numeric value \"%s\" in attribute \"%s\"\n", file, line, c, attr->name);
148 static uint64_t getnumattrib (struct rnndb *db, char *file, int line, xmlAttr *attr) {
149 char *c = getattrib(db, file, line, attr);
150 return getnum(db, file, line, attr, c);
153 static int trytop (struct rnndb *db, char *file, xmlNode *node);
155 static int trydoc (struct rnndb *db, char *file, xmlNode *node) {
164 static struct rnnvalue *parsevalue(struct rnndb *db, char *file, xmlNode *node);
165 static struct rnnbitfield *parsebitfield(struct rnndb *db, char *file, xmlNode *node);
167 static int trytypetag (struct rnndb *db, char *file, xmlNode *node, struct rnntypeinfo *ti) {
169 struct rnnvalue *val = parsevalue(db, file, node);
174 struct rnnbitfield *bf = parsebitfield(db, file, node);
181 static int trytypeattr (struct rnndb *db, char *file, xmlNode *node, xmlAttr *attr, struct rnntypeinfo *ti) {
183 ti->shr = getnumattrib(db, file, node->line, attr);
186 ti->min = getnumattrib(db, file, node->line, attr);
190 ti->max = getnumattrib(db, file, node->line, attr);
194 ti->align = getnumattrib(db, file, node->line, attr);
198 ti->name = strdup(getattrib(db, file, node->line, attr));;
201 ti->radix = getnumattrib(db, file, node->line, attr);
205 ti->high = ti->low = getnumattrib(db, file, node->line, attr);
208 ti->low = getnumattrib(db, file, node->line, attr);
211 ti->high = getnumattrib(db, file, node->line, attr);
214 ti->addvariant = getboolattrib(db, file, node->line, attr);
220 static struct rnnvalue *parsevalue(struct rnndb *db, char *file, xmlNode *node) {
226 val->name = strdup(getattrib(db, file, node->line, attr));
228 val->value = getnumattrib(db, file, node->line, attr);
231 val->varinfo.varsetstr = strdup(getattrib(db, file, node->line, attr));
233 val->varinfo.variantsstr = strdup(getattrib(db, file, node->line, attr));
235 rnn_err(db, "%s:%d: wrong attribute \"%s\" for value\n", file, node->line, attr->name);
242 } else if (!trytop(db, file, chain) && !trydoc(db, file, chain)) {
243 rnn_err(db, "%s:%d: wrong tag in %s: <%s>\n", file, chain->line, node->name, chain->name);
248 rnn_err(db, "%s:%d: nameless value\n", file, node->line);
255 static void parsespectype(struct rnndb *db, char *file, xmlNode *node) {
262 res->name = strdup(getattrib(db, file, node->line, attr));
263 } else if (!trytypeattr(db, file, node, attr, &res->typeinfo)) {
264 rnn_err(db, "%s:%d: wrong attribute \"%s\" for spectype\n", file, node->line, attr->name);
269 rnn_err(db, "%s:%d: nameless spectype\n", file, node->line);
272 for (i = 0; i < db->spectypesnum; i++)
273 if (!strcmp(db->spectypes[i]->name, res->name)) {
274 rnn_err(db, "%s:%d: duplicated spectype name %s\n", file, node->line, res->name);
277 ADDARRAY(db->spectypes, res);
281 } else if (!trytypetag(db, file, chain, &res->typeinfo) && !trytop(db, file, chain) && !trydoc(db, file, chain)) {
282 rnn_err(db, "%s:%d: wrong tag in spectype: <%s>\n", file, chain->line, chain->name);
288 static void parseenum(struct rnndb *db, char *file, xmlNode *node) {
299 name = getattrib(db, file, node->line, attr);
301 bare = getboolattrib(db, file, node->line, attr);
303 isinline = getboolattrib(db, file, node->line, attr);
305 prefixstr = strdup(getattrib(db, file, node->line, attr));
307 varsetstr = strdup(getattrib(db, file, node->line, attr));
309 variantsstr = strdup(getattrib(db, file, node->line, attr));
311 rnn_err(db, "%s:%d: wrong attribute \"%s\" for enum\n", file, node->line, attr->name);
316 rnn_err(db, "%s:%d: nameless enum\n", file, node->line);
320 for (i = 0; i < db->enumsnum; i++)
321 if (!strcmp(db->enums[i]->name, name)) {
322 cur = db->enums[i];
330 rnn_err(db, "%s:%d: merge fail for enum %s\n", file, node->line, node->name);
341 ADDARRAY(db->enums, cur);
347 struct rnnvalue *val = parsevalue(db, file, chain);
350 } else if (!trytop(db, file, chain) && !trydoc(db, file, chain)) {
351 rnn_err(db, "%s:%d: wrong tag in enum: <%s>\n", file, chain->line, chain->name);
357 static struct rnnbitfield *parsebitfield(struct rnndb *db, char *file, xmlNode *node) {
364 bf->name = strdup(getattrib(db, file, node->line, attr));
366 bf->varinfo.varsetstr = strdup(getattrib(db, file, node->line, attr));
368 bf->varinfo.variantsstr = strdup(getattrib(db, file, node->line, attr));
369 } else if (!trytypeattr(db, file, node, attr, &bf->typeinfo)) {
370 rnn_err(db, "%s:%d: wrong attribute \"%s\" for bitfield\n", file, node->line, attr->name);
377 } else if (!trytypetag(db, file, chain, &bf->typeinfo) && !trytop(db, file, chain) && !trydoc(db, file, chain)) {
378 rnn_err(db, "%s:%d: wrong tag in %s: <%s>\n", file, chain->line, node->name, chain->name);
383 rnn_err(db, "%s:%d: nameless bitfield\n", file, node->line);
386 rnn_err(db, "%s:%d: bitfield has wrong placement\n", file, node->line);
393 static void parsebitset(struct rnndb *db, char *file, xmlNode *node) {
404 name = getattrib(db, file, node->line, attr);
406 bare = getboolattrib(db, file, node->line, attr);
408 isinline = getboolattrib(db, file, node->line, attr);
410 prefixstr = strdup(getattrib(db, file, node->line, attr));
412 varsetstr = strdup(getattrib(db, file, node->line, attr));
414 variantsstr = strdup(getattrib(db, file, node->line, attr));
416 rnn_err(db, "%s:%d: wrong attribute \"%s\" for bitset\n", file, node->line, attr->name);
421 rnn_err(db, "%s:%d: nameless bitset\n", file, node->line);
425 for (i = 0; i < db->bitsetsnum; i++)
426 if (!strcmp(db->bitsets[i]->name, name)) {
427 cur = db->bitsets[i];
435 rnn_err(db, "%s:%d: merge fail for bitset %s\n", file, node->line, node->name);
446 ADDARRAY(db->bitsets, cur);
452 struct rnnbitfield *bf = parsebitfield(db, file, chain);
455 } else if (!trytop(db, file, chain) && !trydoc(db, file, chain)) {
456 rnn_err(db, "%s:%d: wrong tag in bitset: <%s>\n", file, chain->line, chain->name);
462 static struct rnndelem *trydelem(struct rnndb *db, char *file, xmlNode *node) {
470 res->name = strdup(getattrib(db, file, node->line, attr));
472 rnn_err(db, "%s:%d: wrong attribute \"%s\" for %s\n", file, node->line, attr->name, node->name);
477 rnn_err(db, "%s:%d: nameless use-group\n", file, node->line);
491 res->name = strdup(getattrib(db, file, node->line, attr));
493 res->offset = getnumattrib(db, file, node->line, attr);
495 char *str = strdup(getattrib(db, file, node->line, attr));
498 uint64_t offset = getnum(db, file, node->line, attr, tok);
507 res->doffset = strdup(getattrib(db, file, node->line, attr));
510 char *str = strdup(getattrib(db, file, node->line, attr));
521 res->length = getnumattrib(db, file, node->line, attr);
523 res->stride = getnumattrib(db, file, node->line, attr);
525 res->varinfo.prefixstr = strdup(getattrib(db, file, node->line, attr));
527 res->varinfo.varsetstr = strdup(getattrib(db, file, node->line, attr));
529 res->varinfo.variantsstr = strdup(getattrib(db, file, node->line, attr));
531 const char *enumname = getattrib(db, file, node->line, attr);
532 res->index = rnn_findenum(db, enumname);
534 rnn_err(db, "%s:%d: invalid enum name \"%s\"\n", file, node->line, enumname);
537 rnn_err(db, "%s:%d: wrong attribute \"%s\" for %s\n", file, node->line, attr->name, node->name);
545 } else if ((delem = trydelem(db, file, chain))) {
547 } else if (!trytop(db, file, chain) && !trydoc(db, file, chain)) {
548 rnn_err(db, "%s:%d: wrong tag in %s: <%s>\n", file, chain->line, node->name, chain->name);
583 res->name = strdup(getattrib(db, file, node->line, attr));
585 res->offset = getnumattrib(db, file, node->line, attr);
587 res->length = getnumattrib(db, file, node->line, attr);
589 res->stride = getnumattrib(db, file, node->line, attr);
591 res->varinfo.varsetstr = strdup(getattrib(db, file, node->line, attr));
593 res->varinfo.variantsstr = strdup(getattrib(db, file, node->line, attr));
595 char *str = getattrib(db, file, node->line, attr);
604 } else if (!trytypeattr(db, file, node, attr, &res->typeinfo)) {
605 rnn_err(db, "%s:%d: wrong attribute \"%s\" for register\n", file, node->line, attr->name);
612 } else if (!trytypetag(db, file, chain, &res->typeinfo) && !trytop(db, file, chain) && !trydoc(db, file, chain)) {
613 rnn_err(db, "%s:%d: wrong tag in %s: <%s>\n", file, chain->line, node->name, chain->name);
618 rnn_err(db, "%s:%d: nameless register\n", file, node->line);
625 static void parsegroup(struct rnndb *db, char *file, xmlNode *node) {
631 name = getattrib(db, file, node->line, attr);
633 rnn_err(db, "%s:%d: wrong attribute \"%s\" for group\n", file, node->line, attr->name);
638 rnn_err(db, "%s:%d: nameless group\n", file, node->line);
642 for (i = 0; i < db->groupsnum; i++)
643 if (!strcmp(db->groups[i]->name, name)) {
644 cur = db->groups[i];
650 ADDARRAY(db->groups, cur);
656 } else if ((delem = trydelem(db, file, chain))) {
658 } else if (!trytop(db, file, chain) && !trydoc(db, file, chain)) {
659 rnn_err(db, "%s:%d: wrong tag in group: <%s>\n", file, chain->line, chain->name);
665 static void parsedomain(struct rnndb *db, char *file, xmlNode *node) {
676 name = getattrib(db, file, node->line, attr);
678 bare = getboolattrib(db, file, node->line, attr);
680 size = getnumattrib(db, file, node->line, attr);
682 width = getnumattrib(db, file, node->line, attr);
684 prefixstr = strdup(getattrib(db, file, node->line, attr));
686 varsetstr = strdup(getattrib(db, file, node->line, attr));
688 variantsstr = strdup(getattrib(db, file, node->line, attr));
690 rnn_err(db, "%s:%d: wrong attribute \"%s\" for domain\n", file, node->line, attr->name);
695 rnn_err(db, "%s:%d: nameless domain\n", file, node->line);
699 for (i = 0; i < db->domainsnum; i++)
700 if (!strcmp(db->domains[i]->name, name)) {
701 cur = db->domains[i];
711 rnn_err(db, "%s:%d: merge fail for domain %s\n", file, node->line, node->name);
726 ADDARRAY(db->domains, cur);
732 } else if ((delem = trydelem(db, file, chain))) {
734 } else if (!trytop(db, file, chain) && !trydoc(db, file, chain)) {
735 rnn_err(db, "%s:%d: wrong tag in domain: <%s>\n", file, chain->line, chain->name);
741 static void parsecopyright(struct rnndb *db, char *file, xmlNode *node) {
742 struct rnncopyright* copyright = &db->copyright;
746 unsigned firstyear = getnumattrib(db, file, node->line, attr);
750 rnn_err(db, "%s:%d: wrong attribute \"%s\" for copyright\n", file, node->line, attr->name);
772 author->name = strdup(getattrib(db, file, chain->line, authorattr));
774 author->email = strdup(getattrib(db, file, chain->line, authorattr));
776 rnn_err(db, "%s:%d: wrong attribute \"%s\" for author\n", file, chain->line, authorattr->name);
787 nickname = strdup(getattrib(db, file, authorchild->line, nickattr));
789 rnn_err(db, "%s:%d: wrong attribute \"%s\" for nick\n", file, authorchild->line, nickattr->name);
794 rnn_err(db, "%s:%d: missing \"name\" attribute for nick\n", file, authorchild->line);
798 rnn_err(db, "%s:%d: wrong tag in author: <%s>\n", file, authorchild->line, authorchild->name);
804 rnn_err(db, "%s:%d: wrong tag in copyright: <%s>\n", file, chain->line, chain->name);
810 static int trytop (struct rnndb *db, char *file, xmlNode *node) {
812 parseenum(db, file, node);
815 parsebitset(db, file, node);
818 parsegroup(db, file, node);
821 parsedomain(db, file, node);
824 parsespectype(db, file, node);
831 subfile = getattrib(db, file, node->line, attr);
833 rnn_err(db, "%s:%d: wrong attribute \"%s\" for import\n", file, node->line, attr->name);
838 rnn_err(db, "%s:%d: missing \"file\" attribute for import\n", file, node->line);
840 rnn_parsefile(db, subfile);
844 parsecopyright(db, file, node);
868 static int validate_doc(struct rnndb *db, xmlDocPtr doc, xmlNodePtr database)
892 rnn_err(db, "could not find schema. Missing schemaLocation?");
898 rnn_err(db, "%s: couldn't find database file. Please set the env var RNN_PATH.\n", schema_name);
916 void rnn_parsefile (struct rnndb *db, char *file_orig) {
922 db->estatus = 1;
926 for (i = 0; i < db->filesnum; i++)
927 if (!strcmp(db->files[i], fname))
930 ADDARRAY(db->files, fname);
933 rnn_err(db, "%s: couldn't open database file. Please set the env var RNN_PATH.\n", fname);
940 rnn_err(db, "%s:%d: wrong top-level tag <%s>\n", fname, root->line, root->name);
943 if (validate_doc(db, doc, root)) {
944 rnn_err(db, "%s: database file has errors\n", fname);
949 } else if (!trytop(db, fname, chain) && !trydoc(db, fname, chain)) {
950 rnn_err(db, "%s:%d: wrong tag in database: <%s>\n", fname, chain->line, chain->name);
1028 static void prepenum(struct rnndb *db, struct rnnenum *en);
1030 static int findvidx (struct rnndb *db, struct rnnenum *en, char *name) {
1035 rnn_err(db, "Cannot find variant %s in enum %s!\n", name, en->name);
1039 static void prepvarinfo (struct rnndb *db, char *what, struct rnnvarinfo *vi, struct rnnvarinfo *parent) {
1046 vi->prefenum = rnn_findenum(db, vi->prefixstr); // XXX
1056 varset = rnn_findenum(db, vi->varsetstr);
1060 rnn_err(db, "%s: tried to use variants without active varset!\n", what);
1089 int idx = findvidx(db, varset, first);
1102 idx1 = findvidx(db, varset, first);
1105 idx2 = findvidx(db, varset, second);
1145 static void prepvalue(struct rnndb *db, struct rnnvalue *val, char *prefix, struct rnnvarinfo *parvi) {
1147 prepvarinfo (db, val->fullname, &val->varinfo, parvi);
1154 static void prepbitfield(struct rnndb *db, struct rnnbitfield *bf, char *prefix, struct rnnvarinfo *parvi);
1156 static void preptypeinfo(struct rnndb *db, struct rnntypeinfo *ti, char *prefix, struct rnnvarinfo *vi, char *file) {
1159 struct rnnenum *en = rnn_findenum (db, ti->name);
1160 struct rnnbitset *bs = rnn_findbitset (db, ti->name);
1161 struct rnnspectype *st = rnn_findspectype (db, ti->name);
1209 rnn_err(db, "%s: unknown type %s\n", prefix, ti->name);
1225 rnn_err(db, "%s: addvariant specified on non-enum type %s\n", prefix, ti->name);
1228 prepbitfield(db, ti->bitfields[i], prefix, vi);
1230 prepvalue(db, ti->vals[i], prefix, vi);
1233 static void prepbitfield(struct rnndb *db, struct rnnbitfield *bf, char *prefix, struct rnnvarinfo *parvi) {
1235 prepvarinfo (db, bf->fullname, &bf->varinfo, parvi);
1238 preptypeinfo(db, &bf->typeinfo, bf->fullname, &bf->varinfo, bf->file);
1243 static void prepdelem(struct rnndb *db, struct rnndelem *elem, char *prefix, struct rnnvarinfo *parvi, int width) {
1247 for (i = 0; i < db->groupsnum; i++)
1248 if (!strcmp(db->groups[i]->name, elem->name)) {
1249 gr = db->groups[i];
1256 rnn_err(db, "group %s not found!\n", elem->name);
1264 prepvarinfo (db, elem->fullname?elem->fullname:prefix, &elem->varinfo, parvi);
1269 rnn_err(db, "%s has non-1 length, but no stride!\n", elem->fullname);
1274 preptypeinfo(db, &elem->typeinfo, elem->name?elem->fullname:prefix, &elem->varinfo, elem->file);
1278 prepdelem(db, elem->subelems[i], elem->name?elem->fullname:prefix, &elem->varinfo, width);
1283 static void prepdomain(struct rnndb *db, struct rnndomain *dom) {
1284 prepvarinfo (db, dom->name, &dom->varinfo, 0);
1287 prepdelem(db, dom->subelems[i], dom->bare?0:dom->name, &dom->varinfo, dom->width);
1291 static void prepenum(struct rnndb *db, struct rnnenum *en) {
1294 prepvarinfo (db, en->name, &en->varinfo, 0);
1299 prepvalue(db, en->vals[i], en->bare?0:en->name, &en->varinfo);
1304 static void prepbitset(struct rnndb *db, struct rnnbitset *bs) {
1305 prepvarinfo (db, bs->name, &bs->varinfo, 0);
1310 prepbitfield(db, bs->bitfields[i], bs->bare?0:bs->name, &bs->varinfo);
1314 static void prepspectype(struct rnndb *db, struct rnnspectype *st) {
1315 preptypeinfo(db, &st->typeinfo, st->name, 0, st->file); // XXX doesn't exactly make sense...
1318 void rnn_prepdb (struct rnndb *db) {
1320 for (i = 0; i < db->enumsnum; i++)
1321 prepenum(db, db->enums[i]);
1322 for (i = 0; i < db->bitsetsnum; i++)
1323 prepbitset(db, db->bitsets[i]);
1324 for (i = 0; i < db->domainsnum; i++)
1325 prepdomain(db, db->domains[i]);
1326 for (i = 0; i < db->spectypesnum; i++)
1327 prepspectype(db, db->spectypes[i]);
1330 struct rnnenum *rnn_findenum (struct rnndb *db, const char *name) {
1332 for (i = 0; i < db->enumsnum; i++)
1333 if (!strcmp(db->enums[i]->name, name))
1334 return db->enums[i];
1338 struct rnnbitset *rnn_findbitset (struct rnndb *db, const char *name) {
1340 for (i = 0; i < db->bitsetsnum; i++)
1341 if (!strcmp(db->bitsets[i]->name, name))
1342 return db->bitsets[i];
1346 struct rnndomain *rnn_finddomain (struct rnndb *db, const char *name) {
1348 for (i = 0; i < db->domainsnum; i++)
1349 if (!strcmp(db->domains[i]->name, name))
1350 return db->domains[i];
1354 struct rnnspectype *rnn_findspectype (struct rnndb *db, const char *name) {
1356 for (i = 0; i < db->spectypesnum; i++)
1357 if (!strcmp(db->spectypes[i]->name, name))
1358 return db->spectypes[i];