Lines Matching +full:eoc +full:- +full:level
1 // SPDX-License-Identifier: GPL-2.0-or-later
119 /* EOC goes first */
166 "EOC",
229 [DIRECTIVE_ENCODING_CONTROL] = "ENCODING-CONTROL",
255 [DIRECTIVE_MINUS_INFINITY] = "MINUS-INFINITY",
265 [DIRECTIVE_PLUS_INFINITY] = "PLUS-INFINITY",
270 [DIRECTIVE_RELATIVE_OID] = "RELATIVE-OID",
325 clen = (dlen < token->size) ? dlen : token->size; in directive_compare()
327 //debug("cmp(%s,%s) = ", token->content, dir); in directive_compare()
329 val = memcmp(token->content, dir, clen); in directive_compare()
335 if (dlen == token->size) { in directive_compare()
339 //debug("%d\n", (int)dlen - (int)token->size); in directive_compare()
340 return dlen - token->size; /* shorter -> negative */ in directive_compare()
355 token_list = tokens = calloc((end - buffer) / 2, sizeof(struct token)); in tokenise()
367 nl = memchr(line, '\n', end - buffer); in tokenise()
375 /* Remove "--" comments */ in tokenise()
378 while ((p = memchr(p, '-', nl - p))) { in tokenise()
379 if (p[1] == '-') { in tokenise()
382 while ((q = memchr(q, '-', nl - q))) { in tokenise()
383 if (q[1] == '-') { in tokenise()
384 /* There is - excise the comment */ in tokenise()
386 memmove(p, q, nl - q); in tokenise()
418 while (q < nl && (isalnum(*q) || *q == '-' || *q == '_')) in tokenise()
420 tokens[tix].size = q - p; in tokenise()
447 tokens[tix++].token_type = dir - directives; in tokenise()
461 tokens[tix].size = q - p; in tokenise()
474 if (nl - p >= 3) { in tokenise()
484 if (nl - p >= 2) { in tokenise()
501 if (nl - p >= 1) { in tokenise()
574 if (strcmp(argv[1], "-v") == 0) in main()
576 else if (strcmp(argv[1], "-d") == 0) in main()
580 memmove(&argv[1], &argv[2], (argc - 2) * sizeof(char *)); in main()
581 argc--; in main()
585 fprintf(stderr, "Format: %s [-v] [-d] <grammar-file> <c-file> <hdr-file>\n", in main()
723 if ((*a)->name->size != (*b)->name->size) in type_index_compare()
724 return (*a)->name->size - (*b)->name->size; in type_index_compare()
726 return memcmp((*a)->name->content, (*b)->name->content, in type_index_compare()
727 (*a)->name->size); in type_index_compare()
736 if (token->size != type->name->size) in type_finder()
737 return token->size - type->name->size; in type_finder()
739 return memcmp(token->content, type->name->content, in type_finder()
740 token->size); in type_finder()
752 for (n = 0; n < nr_tokens - 1; n++) in build_type_list()
776 for (n = 0; n < nr_tokens - 1; n++) { in build_type_list()
793 debug("- %*.*s\n", type->name->content); in build_type_list()
812 cursor = type->name; in parse()
819 type->element = parse_type(&cursor, type[1].name, NULL); in parse()
820 type->element->type_def = type; in parse()
824 filename, cursor->line, cursor->content); in parse()
828 } while (type++, !(type->flags & TYPE_STOP_MARKER)); in parse()
842 e->list_next = element_list; in alloc_elem()
864 element->class = ASN1_UNIV; in parse_type()
865 element->method = ASN1_PRIM; in parse_type()
866 element->tag = token_to_tag[cursor->token_type]; in parse_type()
867 element->name = name; in parse_type()
870 if (cursor->token_type == TOKEN_OPEN_SQUARE) { in parse_type()
874 switch (cursor->token_type) { in parse_type()
876 element->class = ASN1_UNIV; in parse_type()
880 element->class = ASN1_APPL; in parse_type()
884 element->class = ASN1_CONT; in parse_type()
887 element->class = ASN1_PRIV; in parse_type()
892 filename, cursor->line, cursor->content); in parse_type()
898 if (cursor->token_type != TOKEN_NUMBER) { in parse_type()
900 filename, cursor->line, cursor->content); in parse_type()
904 element->tag &= ~0x1f; in parse_type()
905 element->tag |= strtoul(cursor->content, &p, 10); in parse_type()
906 element->flags |= ELEMENT_TAG_SPECIFIED; in parse_type()
907 if (p - cursor->content != cursor->size) in parse_type()
913 if (cursor->token_type != TOKEN_CLOSE_SQUARE) { in parse_type()
915 filename, cursor->line, cursor->content); in parse_type()
925 if (cursor->token_type == DIRECTIVE_IMPLICIT) { in parse_type()
926 element->flags |= ELEMENT_IMPLICIT; in parse_type()
931 } else if (cursor->token_type == DIRECTIVE_EXPLICIT) { in parse_type()
932 element->flags |= ELEMENT_EXPLICIT; in parse_type()
940 element->method |= ASN1_CONS; in parse_type()
941 element->compound = implicit ? TAG_OVERRIDE : SEQUENCE; in parse_type()
942 element->children = alloc_elem(); in parse_type()
943 element = element->children; in parse_type()
944 element->class = ASN1_UNIV; in parse_type()
945 element->method = ASN1_PRIM; in parse_type()
946 element->tag = token_to_tag[cursor->token_type]; in parse_type()
947 element->name = name; in parse_type()
951 element->type = cursor; in parse_type()
952 switch (cursor->token_type) { in parse_type()
954 element->compound = ANY; in parse_type()
962 element->compound = NOT_COMPOUND; in parse_type()
967 element->method = ASN1_CONS; in parse_type()
985 element->compound = NOT_COMPOUND; in parse_type()
991 element->compound = NOT_COMPOUND; in parse_type()
995 if (cursor->token_type != DIRECTIVE_STRING) in parse_type()
1001 element->compound = NOT_COMPOUND; in parse_type()
1005 if (cursor->token_type != DIRECTIVE_IDENTIFIER) in parse_type()
1011 element->compound = TYPE_REF; in parse_type()
1016 filename, cursor->line, cursor->content); in parse_type()
1019 cursor->type = *ref; in parse_type()
1020 (*ref)->ref_count++; in parse_type()
1025 element->compound = CHOICE; in parse_type()
1027 element->children = parse_compound(&cursor, end, 1); in parse_type()
1031 element->compound = SEQUENCE; in parse_type()
1032 element->method = ASN1_CONS; in parse_type()
1036 if (cursor->token_type == DIRECTIVE_OF) { in parse_type()
1037 element->compound = SEQUENCE_OF; in parse_type()
1041 element->children = parse_type(&cursor, end, NULL); in parse_type()
1043 element->children = parse_compound(&cursor, end, 0); in parse_type()
1048 element->compound = SET; in parse_type()
1049 element->method = ASN1_CONS; in parse_type()
1053 if (cursor->token_type == DIRECTIVE_OF) { in parse_type()
1054 element->compound = SET_OF; in parse_type()
1058 element->children = parse_type(&cursor, end, NULL); in parse_type()
1060 element->children = parse_compound(&cursor, end, 1); in parse_type()
1066 filename, cursor->line, cursor->content); in parse_type()
1071 if (cursor < end && (cursor->token_type == DIRECTIVE_OPTIONAL || in parse_type()
1072 cursor->token_type == DIRECTIVE_DEFAULT) in parse_type()
1075 top->flags |= ELEMENT_SKIPPABLE; in parse_type()
1078 if (cursor < end && cursor->token_type == TOKEN_OPEN_ACTION) { in parse_type()
1082 if (cursor->token_type != TOKEN_ELEMENT_NAME) { in parse_type()
1084 filename, cursor->line, cursor->content); in parse_type()
1093 action->index = 0; in parse_type()
1094 action->name = cursor->content; in parse_type()
1098 ppaction = &(*ppaction)->next in parse_type()
1100 int cmp = strcmp(action->name, (*ppaction)->name); in parse_type()
1107 action->next = *ppaction; in parse_type()
1113 action->next = NULL; in parse_type()
1118 element->action = action; in parse_type()
1119 cursor->action = action; in parse_type()
1123 if (cursor->token_type != TOKEN_CLOSE_ACTION) { in parse_type()
1125 filename, cursor->line, cursor->content); in parse_type()
1136 filename, cursor->line, cursor->content); in parse_type()
1153 if (cursor->token_type != TOKEN_OPEN_CURLY) { in parse_compound()
1155 filename, cursor->line, cursor->content); in parse_compound()
1162 if (cursor->token_type == TOKEN_OPEN_CURLY) { in parse_compound()
1164 filename, cursor->line); in parse_compound()
1170 if (cursor->token_type == TOKEN_ELEMENT_NAME) { in parse_compound()
1179 element->flags |= ELEMENT_SKIPPABLE | ELEMENT_CONDITIONAL; in parse_compound()
1182 child_p = &element->next; in parse_compound()
1186 if (cursor->token_type != TOKEN_COMMA) in parse_compound()
1193 children->flags &= ~ELEMENT_CONDITIONAL; in parse_compound()
1195 if (cursor->token_type != TOKEN_CLOSE_CURLY) { in parse_compound()
1197 filename, cursor->line, cursor->content); in parse_compound()
1210 static void dump_element(const struct element *e, int level) in dump_element() argument
1213 const struct type *t = e->type_def; in dump_element()
1214 const char *name = e->name ? e->name->content : "."; in dump_element()
1215 const char *tname = t && t->name ? t->name->content : "."; in dump_element()
1218 if (e->class == 0 && e->method == 0 && e->tag == 0) in dump_element()
1220 else if (e->class == ASN1_UNIV) in dump_element()
1222 asn1_classes[e->class], in dump_element()
1223 asn1_methods[e->method], in dump_element()
1224 asn1_universal_tags[e->tag]); in dump_element()
1227 asn1_classes[e->class], in dump_element()
1228 asn1_methods[e->method], in dump_element()
1229 e->tag); in dump_element()
1232 e->flags & ELEMENT_IMPLICIT ? 'I' : '-', in dump_element()
1233 e->flags & ELEMENT_EXPLICIT ? 'E' : '-', in dump_element()
1234 e->flags & ELEMENT_TAG_SPECIFIED ? 'T' : '-', in dump_element()
1235 e->flags & ELEMENT_SKIPPABLE ? 'S' : '-', in dump_element()
1236 e->flags & ELEMENT_CONDITIONAL ? 'C' : '-', in dump_element()
1237 "-tTqQcaro"[e->compound], in dump_element()
1238 level, "", in dump_element()
1242 e->action ? e->action->name : ""); in dump_element()
1243 if (e->compound == TYPE_REF) in dump_element()
1244 dump_element(e->type->type->element, level + 3); in dump_element()
1246 for (c = e->children; c; c = c->next) in dump_element()
1247 dump_element(c, level + 3); in dump_element()
1328 for (action = action_list; action; action = action->next) { in render()
1329 action->index = index++; in render()
1333 action->name); in render()
1338 for (action = action_list; action; action = action->next) in render()
1340 action->name, action->index); in render()
1347 for (action = action_list; action; action = action->next) in render()
1348 fprintf(out, "\t[%4u] = %s,\n", action->index, action->name); in render()
1356 /* We do two passes - the first one calculates all the offsets */ in render()
1360 render_element(NULL, root->element, NULL); in render()
1364 for (e = element_list; e; e = e->list_next) in render()
1365 e->flags &= ~ELEMENT_RENDERED; in render()
1375 render_element(out, root->element, NULL); in render()
1390 * Render the out-of-line elements
1399 render_list = e->render_next; in render_out_of_line_list()
1404 e->entry_index = entry = nr_entries; in render_out_of_line_list()
1406 for (ce = e->children; ce; ce = ce->next) in render_out_of_line_list()
1408 render_depth--; in render_out_of_line_list()
1410 act = e->action ? "_ACT" : ""; in render_out_of_line_list()
1411 switch (e->compound) { in render_out_of_line_list()
1429 if (e->action) in render_out_of_line_list()
1431 e->action->name); in render_out_of_line_list()
1445 if (e->flags & ELEMENT_SKIPPABLE || in render_element()
1446 (tag && tag->flags & ELEMENT_SKIPPABLE)) in render_element()
1449 if ((e->type_def && e->type_def->ref_count > 1) || in render_element()
1453 if (e->type_def && out) { in render_element()
1454 render_more(out, "\t// %s\n", e->type_def->name->content); in render_element()
1458 cond = (e->flags & ELEMENT_CONDITIONAL || in render_element()
1459 (tag && tag->flags & ELEMENT_CONDITIONAL)) ? "COND_" : ""; in render_element()
1460 act = e->action ? "_ACT" : ""; in render_element()
1461 switch (e->compound) { in render_element()
1465 if (e->name) in render_element()
1466 render_more(out, "\t\t// %s", e->name->content); in render_element()
1471 render_element(out, e->children, e); in render_element()
1488 if (e->class == ASN1_UNIV && e->method == ASN1_PRIM && e->tag == 0) in render_element()
1498 if (x->name) in render_element()
1499 render_more(out, "\t\t// %s", x->name->content); in render_element()
1503 if (!tag || !(tag->flags & ELEMENT_TAG_SPECIFIED)) in render_element()
1506 if (tag->class == ASN1_UNIV && in render_element()
1507 tag->tag != 14 && in render_element()
1508 tag->tag != 15 && in render_element()
1509 tag->tag != 31) in render_element()
1511 asn1_classes[tag->class], in render_element()
1512 asn1_methods[tag->method | e->method], in render_element()
1513 asn1_universal_tags[tag->tag]); in render_element()
1516 asn1_classes[tag->class], in render_element()
1517 asn1_methods[tag->method | e->method], in render_element()
1518 tag->tag); in render_element()
1523 switch (e->compound) { in render_element()
1525 render_element(out, e->type->type->element, tag); in render_element()
1526 if (e->action) in render_element()
1533 /* Render out-of-line for multiple use or in render_element()
1535 render_opcode(out, "_jump_target(%u),", e->entry_index); in render_element()
1536 if (e->type_def && e->type_def->name) in render_element()
1537 render_more(out, "\t\t// --> %s", in render_element()
1538 e->type_def->name->content); in render_element()
1540 if (!(e->flags & ELEMENT_RENDERED)) { in render_element()
1541 e->flags |= ELEMENT_RENDERED; in render_element()
1543 render_list_p = &e->render_next; in render_element()
1549 for (ec = e->children; ec; ec = ec->next) in render_element()
1551 render_depth--; in render_element()
1559 /* Render out-of-line for multiple use or in render_element()
1561 render_opcode(out, "_jump_target(%u),", e->entry_index); in render_element()
1562 if (e->type_def && e->type_def->name) in render_element()
1563 render_more(out, "\t\t// --> %s", in render_element()
1564 e->type_def->name->content); in render_element()
1566 if (!(e->flags & ELEMENT_RENDERED)) { in render_element()
1567 e->flags |= ELEMENT_RENDERED; in render_element()
1569 render_list_p = &e->render_next; in render_element()
1576 render_element(out, e->children, NULL); in render_element()
1577 render_depth--; in render_element()
1578 if (e->compound == SEQUENCE_OF) in render_element()
1589 * The bitmask has also to be checked that no non-optional in render_element()
1597 for (ec = e->children; ec; ec = ec->next) in render_element()
1601 if (e->action) in render_element()
1609 if (e->action) in render_element()
1610 render_opcode(out, "_action(ACT_%s),\n", e->action->name); in render_element()