+ case AST_EXP_GLOBAL_IDENTIFIER:
+ {
+ struct filter_node *next;
+
+ if (node->u.expression.pre_op == AST_LINK_UNKNOWN) {
+ fprintf(stderr, "[error] %s: global identifiers need chained identifier \n", __func__);
+ return NULL;
+ }
+ /* We currently only support $ctx (context) identifiers */
+ if (strncmp(node->u.expression.u.identifier,
+ "$ctx", strlen("$ctx")) != 0) {
+ fprintf(stderr, "[error] %s: \"%s\" global identifier is unknown. Only \"$ctx\" currently implemented.\n", __func__, node->u.expression.u.identifier);
+ return NULL;
+ }
+ next = node->u.expression.next;
+ if (!next) {
+ fprintf(stderr, "[error] %s: Expecting a context name, e.g. \'$ctx.name\'.\n", __func__);
+ return NULL;
+ }
+ if (next->type != NODE_EXPRESSION) {
+ fprintf(stderr, "[error] %s: Expecting expression.\n", __func__);
+ return NULL;
+ }
+ if (next->u.expression.type != AST_EXP_IDENTIFIER) {
+ fprintf(stderr, "[error] %s: Expecting identifier.\n", __func__);
+ return NULL;
+ }
+ if (next->u.expression.pre_op != AST_LINK_UNKNOWN) {
+ fprintf(stderr, "[error] %s: dotted and dereferenced identifiers not supported after identifier\n", __func__);
+ return NULL;
+ }
+ return make_op_load_get_context_ref(next->u.expression.u.identifier,
+ side);
+ }