Bladeren bron

ncd: NCDModuleProcess: add interface for resolving variables from the end of the process

ambrop7 14 jaren geleden
bovenliggende
commit
d6424593a0
3 gewijzigde bestanden met toevoegingen van 85 en 3 verwijderingen
  1. 40 1
      ncd/NCDModule.c
  2. 10 1
      ncd/NCDModule.h
  3. 35 1
      ncd/ncd.c

+ 40 - 1
ncd/NCDModule.c

@@ -468,12 +468,51 @@ void NCDModuleProcess_Terminate (NCDModuleProcess *o)
     o->interp_func_event(o->interp_user, NCDMODULEPROCESS_INTERP_EVENT_TERMINATE);
 }
 
-void NCDModuleProcess_Interp_SetHandlers (NCDModuleProcess *o, void *interp_user,  NCDModuleProcess_interp_func_event interp_func_event)
+int NCDModuleProcess_GetVar (NCDModuleProcess *o, const char *name, NCDValue *out)
+{
+    DebugObject_Access(&o->d_obj);
+    ASSERT(o->state != PROCESS_STATE_INIT)
+    ASSERT(name)
+    ASSERT(out)
+    
+    // interpreter gone?
+    if (o->state == PROCESS_STATE_TERMINATED_PENDING || o->state == PROCESS_STATE_TERMINATED) {
+        return 0;
+    }
+    
+    int res = o->interp_func_getvar(o->interp_user, name, out);
+    ASSERT(res == 0 || res == 1)
+    
+    return res;
+}
+
+NCDModuleInst * NCDModuleProcess_GetObj (NCDModuleProcess *o, const char *name)
+{
+    DebugObject_Access(&o->d_obj);
+    ASSERT(o->state != PROCESS_STATE_INIT)
+    ASSERT(name)
+    
+    // interpreter gone?
+    if (o->state == PROCESS_STATE_TERMINATED_PENDING || o->state == PROCESS_STATE_TERMINATED) {
+        return NULL;
+    }
+    
+    return o->interp_func_getobj(o->interp_user, name);
+}
+
+void NCDModuleProcess_Interp_SetHandlers (NCDModuleProcess *o, void *interp_user,
+                                          NCDModuleProcess_interp_func_event interp_func_event,
+                                          NCDModuleProcess_interp_func_getvar interp_func_getvar,
+                                          NCDModuleProcess_interp_func_getobj interp_func_getobj)
 {
     ASSERT(interp_func_event)
+    ASSERT(interp_func_getvar)
+    ASSERT(interp_func_getobj)
     
     o->interp_user = interp_user;
     o->interp_func_event = interp_func_event;
+    o->interp_func_getvar = interp_func_getvar;
+    o->interp_func_getobj = interp_func_getobj;
 }
 
 void NCDModuleProcess_Interp_Up (NCDModuleProcess *o)

+ 10 - 1
ncd/NCDModule.h

@@ -56,6 +56,8 @@ typedef void (*NCDModuleProcess_handler_event) (void *user, int event);
 #define NCDMODULEPROCESS_INTERP_EVENT_TERMINATE 2
 
 typedef void (*NCDModuleProcess_interp_func_event) (void *user, int event);
+typedef int (*NCDModuleProcess_interp_func_getvar) (void *user, const char *name, NCDValue *out);
+typedef struct NCDModuleInst_s * (*NCDModuleProcess_interp_func_getobj) (void *user, const char *name);
 
 struct NCDModule;
 
@@ -96,6 +98,8 @@ typedef struct NCDModuleProcess_s {
     int state;
     void *interp_user;
     NCDModuleProcess_interp_func_event interp_func_event;
+    NCDModuleProcess_interp_func_getvar interp_func_getvar;
+    NCDModuleProcess_interp_func_getobj interp_func_getobj;
     DebugObject d_obj;
 } NCDModuleProcess;
 
@@ -121,7 +125,12 @@ int NCDModuleProcess_Init (NCDModuleProcess *o, NCDModuleInst *n, const char *te
 void NCDModuleProcess_Free (NCDModuleProcess *o);
 void NCDModuleProcess_Continue (NCDModuleProcess *o);
 void NCDModuleProcess_Terminate (NCDModuleProcess *o);
-void NCDModuleProcess_Interp_SetHandlers (NCDModuleProcess *o, void *interp_user,  NCDModuleProcess_interp_func_event interp_func_event);
+int NCDModuleProcess_GetVar (NCDModuleProcess *o, const char *name, NCDValue *out) WARN_UNUSED;
+NCDModuleInst * NCDModuleProcess_GetObj (NCDModuleProcess *o, const char *name) WARN_UNUSED;
+void NCDModuleProcess_Interp_SetHandlers (NCDModuleProcess *o, void *interp_user,
+                                          NCDModuleProcess_interp_func_event interp_func_event,
+                                          NCDModuleProcess_interp_func_getvar interp_func_getvar,
+                                          NCDModuleProcess_interp_func_getobj interp_func_getobj);
 void NCDModuleProcess_Interp_Up (NCDModuleProcess *o);
 void NCDModuleProcess_Interp_Down (NCDModuleProcess *o);
 void NCDModuleProcess_Interp_Terminated (NCDModuleProcess *o);

+ 35 - 1
ncd/ncd.c

@@ -176,6 +176,8 @@ static NCDModuleInst * process_statement_instance_handler_getobj (struct process
 static int process_statement_instance_handler_initprocess (struct process_statement *ps, NCDModuleProcess *mp, const char *template_name, NCDValue args);
 static void process_statement_instance_logfunc (struct process_statement *ps);
 static void process_moduleprocess_func_event (struct process *p, int event);
+static int process_moduleprocess_func_getvar (struct process *p, const char *name, NCDValue *out);
+static NCDModuleInst * process_moduleprocess_func_getobj (struct process *p, const char *name);
 
 int main (int argc, char **argv)
 {
@@ -685,7 +687,10 @@ int process_new (struct NCDConfig_interfaces *conf, NCDModuleProcess *module_pro
     
     // set module process handlers
     if (p->module_process) {
-        NCDModuleProcess_Interp_SetHandlers(p->module_process, p, (NCDModuleProcess_interp_func_event)process_moduleprocess_func_event);
+        NCDModuleProcess_Interp_SetHandlers(p->module_process, p,
+                                            (NCDModuleProcess_interp_func_event)process_moduleprocess_func_event,
+                                            (NCDModuleProcess_interp_func_getvar)process_moduleprocess_func_getvar,
+                                            (NCDModuleProcess_interp_func_getobj)process_moduleprocess_func_getobj);
     }
     
     // set arguments
@@ -1478,3 +1483,32 @@ void process_moduleprocess_func_event (struct process *p, int event)
         default: ASSERT(0);
     }
 }
+
+int process_moduleprocess_func_getvar (struct process *p, const char *name, NCDValue *out)
+{
+    ASSERT(p->module_process)
+    
+    if (p->num_statements > process_rap(p)) {
+        process_log(p, BLOG_ERROR, "module process tried to resolve variable %s but it's dirty", name);
+        return 0;
+    }
+    
+    return process_resolve_variable(p, p->num_statements, name, out);
+}
+
+NCDModuleInst * process_moduleprocess_func_getobj (struct process *p, const char *name)
+{
+    ASSERT(p->module_process)
+    
+    if (p->num_statements > process_rap(p)) {
+        process_log(p, BLOG_ERROR, "module process tried to resolve object %s but it's dirty", name);
+        return NULL;
+    }
+    
+    struct process_statement *rps = process_resolve_object(p, p->num_statements, name);
+    if (!rps) {
+        return NULL;
+    }
+    
+    return &rps->inst;
+}