23static FILE *webidl_parsetracef;
53 while (
end->l != NULL) {
72 while (cur->
l != NULL) {
162 if (
node->
l != NULL) {
169 return cb(
node, ctx);
198 webidl_enumerate_node,
212 if ((
node == NULL) || (
node == prev)) {
216 if (
node->
l != prev) {
223 if (cb(
node, ctx) != 0) {
255 while (
node != NULL) {
260 if (ident_node != NULL) {
261 if (strcmp(ident_node->
r.
text, ident) == 0)
418 return "Literal (null)";
421 return "Literal (int)";
424 return "Literal (bool)";
427 return "Literal (float)";
430 return "Literal (string)";
433 return "Extended Attribute";
454 fprintf(dumpf,
": none\n");
458 fprintf(dumpf,
": unsigned\n");
462 fprintf(dumpf,
": unrestricted\n");
466 fprintf(dumpf,
": readonly\n");
470 fprintf(dumpf,
": static\n");
474 fprintf(dumpf,
": inherit\n");
484 fprintf(dumpf,
": %s\n",
492 fprintf(dumpf,
": getter\n");
496 fprintf(dumpf,
": setter\n");
500 fprintf(dumpf,
": creator\n");
504 fprintf(dumpf,
": deleter\n");
508 fprintf(dumpf,
": legacy caller\n");
519 fprintf(dumpf,
": false\n");
521 fprintf(dumpf,
": true\n");
531 fprintf(dumpf,
"\n");
541static int webidl_ast_dump(FILE *dumpf,
struct webidl_node *
node,
int indent)
543 const char *SPACES=
" ";
545 while (
node != NULL) {
546 fprintf(dumpf,
"%.*s%s", indent, SPACES,
547 webidl_node_type_to_str(
node->
type));
556 fprintf(dumpf,
"\n");
557 webidl_ast_dump(dumpf, next, indent + 2);
560 webidl_ast_dump_int(dumpf,
node);
563 fprintf(dumpf,
": \"%s\"\n", txt);
585 webidl_ast_dump(dumpf,
node, 0);
593static FILE *idlopen(
const char *
filename)
601 printf(
"Opening IDL file %s\n",
filename);
607 fullname =
malloc(fulllen);
610 printf(
"Opening IDL file %s\n", fullname);
612 idlfile = fopen(fullname,
"r");
626 fprintf(stderr,
"Error opening %s: %s\n",
639 tracenamelen =
SLEN(
"webidl--trace") + strlen(
filename) + 1;
640 tracename =
malloc(tracenamelen);
641 snprintf(tracename, tracenamelen,
"webidl-%s-trace",
filename);
642 webidl_parsetracef =
genb_fopen(tracename,
"w");
645 webidl_parsetracef = NULL;
655 if (webidl_parsetracef != NULL) {
656 fclose(webidl_parsetracef);
667 va_start(ap, format);
669 if (webidl_parsetracef == NULL) {
670 ret = vfprintf(stream, format, ap);
672 ret = vfprintf(webidl_parsetracef, format, ap);
698 while (child->
l != NULL) {
699 if (child->
l ==
node) {
710static int implements_copy_nodes(
struct webidl_node *src_node,
719 while (src != NULL) {
727 dst_node->
r.
node = dst;
733intercalate_implements(
struct webidl_node *interface_node,
void *ctx)
743 while (implements_node != NULL) {
753 intercalate_implements(implements_interface_node, webidl_ast);
755 implements_copy_nodes(implements_interface_node, interface_node);
758 webidl_unlink(interface_node, implements_node);
772 if (webidl_ast != NULL) {
781 intercalate_implements,
814 return "unsigned short";
821 return "unsigned long";
struct webidl_node * node
enum webidl_node_type type
FILE * genb_fopen(const char *fname, const char *mode)
int webidl_parse(struct webidl_node **webidl_ast)
struct webidl_node * webidl_node_getnode(struct webidl_node *node)
struct webidl_node * webidl_node_new(enum webidl_node_type type, struct webidl_node *l, void *r)
int webidl_node_enumerate_type(struct webidl_node *node, enum webidl_node_type type)
struct webidl_node * webidl_node_find_type_ident(struct webidl_node *root_node, enum webidl_node_type type, const char *ident)
int webidl_cmp_node_type(struct webidl_node *node, void *ctx)
int webidl_intercalate_implements(struct webidl_node *webidl_ast)
struct webidl_node * webidl_node_append(struct webidl_node *list, struct webidl_node *node)
struct webidl_node * webidl_node_prepend(struct webidl_node *list, struct webidl_node *inst)
struct webidl_node * webidl_node_add(struct webidl_node *node, struct webidl_node *list)
struct webidl_node * webidl_new_number_node(enum webidl_node_type type, struct webidl_node *l, int number)
char * webidl_node_gettext(struct webidl_node *node)
struct webidl_node * webidl_node_find(struct webidl_node *node, struct webidl_node *prev, webidl_callback_t *cb, void *ctx)
int webidl_dump_ast(struct webidl_node *node)
int webidl_node_for_each_type(struct webidl_node *node, enum webidl_node_type type, webidl_callback_t *cb, void *ctx)
const char * webidl_type_to_str(enum webidl_type_modifier m, enum webidl_type t)
int * webidl_node_getint(struct webidl_node *node)
int webidl_parsefile(char *filename, struct webidl_node **webidl_ast)
float * webidl_node_getfloat(struct webidl_node *node)
enum webidl_node_type webidl_node_gettype(struct webidl_node *node)
int webidl_fprintf(FILE *stream, const char *format,...)
struct webidl_node * webidl_node_find_type(struct webidl_node *node, struct webidl_node *prev, enum webidl_node_type type)
void webidl_restart(FILE *)
int() webidl_callback_t(struct webidl_node *node, void *ctx)
@ WEBIDL_TYPE_SPECIAL_CREATOR
@ WEBIDL_TYPE_SPECIAL_SETTER
@ WEBIDL_TYPE_SPECIAL_DELETER
@ WEBIDL_TYPE_SPECIAL_GETTER
@ WEBIDL_TYPE_SPECIAL_LEGACYCALLER
@ WEBIDL_NODE_TYPE_TYPE_ARRAY
@ WEBIDL_NODE_TYPE_LITERAL_STRING
@ WEBIDL_NODE_TYPE_DICTIONARY
@ WEBIDL_NODE_TYPE_TYPE_BASE
@ WEBIDL_NODE_TYPE_LITERAL_NULL
@ WEBIDL_NODE_TYPE_OPERATION
@ WEBIDL_NODE_TYPE_INTERFACE
@ WEBIDL_NODE_TYPE_EXTENDED_ATTRIBUTE
@ WEBIDL_NODE_TYPE_SPECIAL
@ WEBIDL_NODE_TYPE_TYPE_NULLABLE
@ WEBIDL_NODE_TYPE_INHERITANCE
@ WEBIDL_NODE_TYPE_ATTRIBUTE
@ WEBIDL_NODE_TYPE_MODIFIER
@ WEBIDL_NODE_TYPE_OPTIONAL
@ WEBIDL_NODE_TYPE_LITERAL_BOOL
@ WEBIDL_NODE_TYPE_ARGUMENT
@ WEBIDL_NODE_TYPE_ELLIPSIS
@ WEBIDL_NODE_TYPE_LITERAL_INT
@ WEBIDL_NODE_TYPE_INTERFACE_IMPLEMENTS
@ WEBIDL_NODE_TYPE_LITERAL_FLOAT
@ WEBIDL_TYPE_MODIFIER_INHERIT
@ WEBIDL_TYPE_MODIFIER_UNSIGNED
@ WEBIDL_TYPE_MODIFIER_NONE
@ WEBIDL_TYPE_MODIFIER_STATIC
@ WEBIDL_TYPE_MODIFIER_UNRESTRICTED
@ WEBIDL_TYPE_MODIFIER_READONLY