static FORMAT_PTR Enum_Format(Format_Parse_Ptr parser, BOOLEAN *error) { TokenPtr Token; FORMAT_PTR Form, subform; LIST_PTR format_list; int num_formats, i, maxVal; num_formats = 0; Token = NextToken(parser); if (Token->Type == COLON_TOK) { Token = NextToken(parser); if (Token->Type != INT_TOK) { *error = TRUE; ParserError(Token, parser, "an integer"); return NULL; } else { maxVal = Token->value.num; } } else { format_list = x_ipc_listCreate(); do { if (num_formats > 0) Token = NextToken(parser); if (Token->Type != STR_TOK) { *error = TRUE; ParserError(Token, parser, "a string"); return NULL; } else { Form = new_n_formatter(Token->value.str); /* More efficient for Lisp if all enum format names are upper case */ LOCK_M_MUTEX; if (IS_LISP_MODULE()) { upcase(Form->formatter.name); } UNLOCK_M_MUTEX; x_ipc_listInsertItem((char *)Form, format_list); num_formats++; } Token = NextToken(parser); } while (Token->Type == COMMA_TOK); UngetToken(parser, Token); maxVal = num_formats - 1; } Form = new_a_formatter(EnumFMT, num_formats+2); Form->formatter.a[1].i = maxVal; if (num_formats > 0) { /* Index from high to low since "format_list" has formatters in reverse order */ subform = (FORMAT_PTR)x_ipc_listFirst(format_list); for(i=num_formats;i>0;i--) { Form->formatter.a[i+1].f = subform; subform = (FORMAT_PTR)x_ipc_listNext(format_list); } x_ipc_listFree(&format_list); } return Form; }
void x_ipcModError(const char *description, ...) { #ifndef NMP_IPC x_ipcStats(stderr); #endif #ifdef NMP_IPC if (ipcVerbosity >= IPC_Print_Errors) #endif if (description) { va_list args; va_start(args, description); vfprintf(stderr, (char *)description, args); fprintf(stderr, "\n"); va_end(args); FLUSH_IF_NEEDED(stderr); } #ifdef NMP_IPC if (ipcVerbosity >= IPC_Exit_On_Errors) #endif { x_ipcClose(); LOCK_M_MUTEX; if (mGlobalp()) { #ifdef LISP if (IS_LISP_MODULE()) { if (GET_M_GLOBAL(lispExitGlobal) != NULL) (*(GET_M_GLOBAL(lispExitGlobal)))(); } else #endif /* LISP */ { if (GET_M_GLOBAL(x_ipcExitHnd)) { (*(GET_M_GLOBAL(x_ipcExitHnd)))(); } else { exit(-1); } } } UNLOCK_M_MUTEX; } }
void x_ipc_encodeMsgData(CONST_FORMAT_PTR Format, const void *DataStruct, DATA_MSG_PTR dataMsg, int32 BStart) { dataMsg->dataStruct = (const char *)DataStruct; if (Format == NULL) { dataMsg->msgData = NULL; } else { BOOLEAN isLisp; LOCK_M_MUTEX; isLisp = IS_LISP_MODULE(); UNLOCK_M_MUTEX; if (!isLisp && x_ipc_sameFixedSizeDataBuffer(Format)) { dataMsg->msgData = (char *)DataStruct; } else { dataMsg->msgData = (char *)x_ipcMalloc((unsigned)dataMsg->msgTotal); x_ipc_encodeData(Format, DataStruct, dataMsg->msgData, BStart, dataMsg->msgTotal); } } dataMsg->vec = x_ipc_createVectorization(Format, (const char *)DataStruct,dataMsg->msgData, dataMsg->msgTotal); }
HND_PTR x_ipc_selfRegisterHnd(int sd, MODULE_PTR hndOrg, HND_DATA_PTR hndData, X_IPC_HND_FN hndProc) { int32 localId; MSG_PTR msg; HND_PTR hnd; HND_KEY_TYPE hndKey; msg = x_ipc_findOrRegisterMessage(hndData->msgName); hndKey.num = sd; hndKey.str = hndData->hndName; LOCK_CM_MUTEX; hnd = GET_HANDLER(&hndKey); UNLOCK_CM_MUTEX; if (!hnd) { hnd = NEW(HND_TYPE); hnd->sd = sd; hnd->localId = 0; hnd->msg = NULL; hnd->hndProc = hndProc; hnd->hndOrg = hndOrg; hnd->hndData = hndData; hnd->msgList = x_ipc_listCreate(); hnd->resource = NULL; hnd->hndLanguage = C_LANGUAGE; /* The default */ #ifdef NMP_IPC hnd->clientData = NO_CLIENT_DATA; hnd->isRegistered = TRUE; #endif LOCK_CM_MUTEX; ADD_HANDLER(&hndKey, hnd); localId = x_ipc_idTableInsert((char *)hnd, GET_C_GLOBAL(hndIdTable)); UNLOCK_CM_MUTEX; hnd->localId = localId; if (hndProc) hnd->hndData->refId = localId; } else { LOCK_M_MUTEX; if (!IS_LISP_MODULE() && hndProc != hnd->hndProc) { /* 24-Jun-91: fedor: the warning is not meaningful for lisp because each re-register will cause a pointer change - lisp functions are not at static locations like c */ X_IPC_MOD_WARNING1("\nWARNING: Procedure change ignored for existing handler %s.\n", hnd->hndData->hndName); } UNLOCK_M_MUTEX; } /* 3-Sep-90: fedor: NULL forces initial module cache of a message. */ hnd->msg = NULL; if (!x_ipc_listMemberItem((char *)hnd, msg->hndList)) x_ipc_listInsertItem((char *)hnd, msg->hndList); if (!x_ipc_listMemberItem((char *)msg, hnd->msgList)) x_ipc_listInsertItem((char *)msg, hnd->msgList); return hnd; }