service_t * new_service( bootstrap_info_t *bootstrap, const char *name, mach_port_t service_port, boolean_t isActive, servicetype_t servicetype, server_t *serverp) { service_t *servicep; servicep = NEW(service_t, 1); if (servicep != NULL) { /* Doubly linked list */ services.prev->next = servicep; servicep->prev = services.prev; servicep->next = &services; services.prev = servicep; nservices += 1; strncpy(servicep->name, name, sizeof servicep->name); LAST_ELEMENT(servicep->name) = '\0'; servicep->servicetype = servicetype; servicep->bootstrap = bootstrap; servicep->port = service_port; servicep->server = serverp; servicep->isActive = isActive; } return servicep; }
server_t * new_server( bootstrap_info_t *bootstrap, const char *cmd, int uid, servertype_t servertype) { server_t *serverp; debug("adding new server \"%s\" with uid %d\n", cmd, uid); serverp = NEW(server_t, 1); if (serverp != NULL) { /* Doubly linked list */ servers.prev->next = serverp; serverp->prev = servers.prev; serverp->next = &servers; servers.prev = serverp; bootstrap->ref_count++; serverp->bootstrap = bootstrap; serverp->pid = NO_PID; serverp->task_port = MACH_PORT_NULL; serverp->uid = uid; serverp->port = MACH_PORT_NULL; serverp->servertype = servertype; serverp->activity = 0; serverp->active_services = 0; strncpy(serverp->cmd, cmd, sizeof serverp->cmd); LAST_ELEMENT(serverp->cmd) = '\0'; } return serverp; }
// the actual engine long engine(int mode, long param_1, long param_2) { // For Exceptions: // mode = ENGINE_MODE_PARAM_1 | MODE_PARAM_2 // (param_1 = error, param_2 = reason) // // For Push: // mode = ENGINE_MODE_PARAM_1 | ENGINE_MODE_NOP // // For Pop: // mode = ENGINE_MODE_NOP | ENGINE_MODE_POP // // For Evaluate: // mode = ENGINE_MODE_PARAM_1 | MODE_PARAM_2 | ENGINE_MODE_EVAL // (param_1 = strlen(string), param_2 = string) cell *restrict ip; cell *restrict cfa; static cell handler_stack[160]; static cell c_return[2]; static cell dummy; #include "prep.h" #include "dict.xt" static int init_engine = 0; if (init_engine == 0) { // one-time initialisation init_engine = 1; LAST_ELEMENT(xt_FORTH_X2d_WORDLIST).a = xt_LASTWORD; // stack-pointers dp = the_data_stack - 1; rp = handler_stack - 1; // return-address for "evaluate" personality dummy.a = &&over; c_return[1].a = &dummy; }