MARPAWRAPPER_EXPORT void genericLogger_log(const genericLogger_t *genericLoggerp, genericLoggerLevel_t leveli, const char *fmts, ...) { va_list ap; #ifdef VA_COPY va_list ap2; #endif char *msgs; static const char *emptyMessages = "Empty message"; genericLoggerCallback_t logCallbackp; void *userDatavp; genericLoggerLevel_t genericLoggerDefaultLogLeveli; if (genericLoggerp != NULL) { if (genericLoggerp->genericLoggerOption.logCallbackp != NULL) { logCallbackp = genericLoggerp->genericLoggerOption.logCallbackp; } else { logCallbackp = &_genericLogger_defaultCallback; } userDatavp = genericLoggerp->genericLoggerOption.userDatavp; genericLoggerDefaultLogLeveli = genericLoggerp->genericLoggerOption.leveli; } else { userDatavp = NULL; logCallbackp = &_genericLogger_defaultCallback; genericLoggerDefaultLogLeveli = GENERICLOGGER_LOGLEVEL_WARNING; } if (leveli >= genericLoggerDefaultLogLeveli) { va_start(ap, fmts); #ifdef VA_COPY VA_COPY(ap2, ap); msgs = (fmts != NULL) ? messageBuilder_ap(fmts, ap2) : (char *) emptyMessages; va_end(ap2); #else msgs = (fmts != NULL) ? messageBuilder_ap(fmts, ap) : (char *) emptyMessages; #endif va_end(ap); if (msgs != messageBuilder_internalErrors()) { logCallbackp(userDatavp, leveli, msgs); } else { logCallbackp(userDatavp, GENERICLOGGER_LOGLEVEL_ERROR, msgs); } if (msgs != emptyMessages && msgs != messageBuilder_internalErrors()) { /* No need to assign to NULL, this is a local variable and we will return just after */ free(msgs); } } }
void marpaXml_log(marpaXmlLog_t *marpaXmlLogp, marpaXmlLogLevel_t marpaXmlLogLeveli, const char *fmts, ...) { va_list ap; #ifdef VA_COPY va_list ap2; #endif char *msgs; static const char *emptyMessages = "Empty message"; marpaXmlLogCallback_t logCallbackp; void *userDatavp; marpaXmlLogLevel_t marpaXmlDefaultLogLeveli; if (marpaXmlLogp != NULL) { if (marpaXmlLogp->logCallbackp != NULL) { logCallbackp = marpaXmlLogp->logCallbackp; } else { logCallbackp = &_marpaXmlLog_defaultCallback; } userDatavp = marpaXmlLogp->userDatavp; marpaXmlDefaultLogLeveli = marpaXmlLogp->marpaXmlLogLeveli; } else { userDatavp = NULL; logCallbackp = &_marpaXmlLog_defaultCallback; marpaXmlDefaultLogLeveli = MARPAXML_LOGLEVEL_WARNING; } if (marpaXmlLogLeveli >= marpaXmlDefaultLogLeveli) { va_start(ap, fmts); #ifdef VA_COPY VA_COPY(ap2, ap); msgs = (fmts != NULL) ? messageBuilder_ap(fmts, ap2) : (char *) emptyMessages; va_end(ap2); #else msgs = (fmts != NULL) ? messageBuilder_ap(fmts, ap) : (char *) emptyMessages; #endif va_end(ap); if (msgs != messageBuilder_internalErrors()) { logCallbackp(userDatavp, marpaXmlLogLeveli, msgs); } else { logCallbackp(userDatavp, MARPAXML_LOGLEVEL_ERROR, msgs); } if (msgs != emptyMessages && msgs != messageBuilder_internalErrors()) { /* No need to assign to NULL, this is a local variable and we will return just after */ free(msgs); } } }
void _marpaXmlLog_defaultCallback(void *userDatavp, marpaXmlLogLevel_t logLeveli, const char *msgs) { /* We are NOT going to do a general log4c mechanism (this can come later), using marpaXml in fact */ /* I.e. we are fixing the default output to be: DD/MM/YYYY hh::mm::ss PREFIX MESSAGE */ const char *prefixs = (logLeveli == MARPAXML_LOGLEVEL_TRACE ) ? "TRACE" : (logLeveli == MARPAXML_LOGLEVEL_DEBUG ) ? "DEBUG" : (logLeveli == MARPAXML_LOGLEVEL_INFO ) ? "INFO" : (logLeveli == MARPAXML_LOGLEVEL_NOTICE ) ? "NOTICE" : (logLeveli == MARPAXML_LOGLEVEL_WARNING ) ? "WARNING" : (logLeveli == MARPAXML_LOGLEVEL_ERROR ) ? "ERROR" : (logLeveli == MARPAXML_LOGLEVEL_CRITICAL ) ? "CRITICAL" : (logLeveli == MARPAXML_LOGLEVEL_ALERT ) ? "ALERT" : (logLeveli == MARPAXML_LOGLEVEL_EMERGENCY) ? "EMERGENCY" : "UNKOWN"; char *dates = dateBuilder("%d/%m/%Y %H:%M:%S"); char *localMsgs = messageBuilder("%s %9s %s\n", dates, prefixs, (msgs != NULL) ? (char *) msgs : (char *) MARPAXML_LOG_NO_MESSAGE); #if (defined(_WIN32) || (_POSIX_C_SOURCE >= 1 || _XOPEN_SOURCE || _POSIX_SOURCE)) #ifdef _WIN32 int filenoStderr = _fileno(stderr); size_t bytesWriten = 0; #else int filenoStderr = fileno(stderr); ssize_t bytesWriten = 0; #endif char *p = localMsgs; size_t count; #endif #if (defined(_WIN32) || (_POSIX_C_SOURCE >= 1 || _XOPEN_SOURCE || _POSIX_SOURCE)) count = strlen(p); while (bytesWriten < count) { #if defined(_WIN32) bytesWriten += _write(filenoStderr, p+bytesWriten, count-bytesWriten); #else bytesWriten += write(filenoStderr, p+bytesWriten, count-bytesWriten); #endif } #else /* Note: this is not asynchroneous safe */ fprintf(stderr, "%s", p); #endif if (dates != dateBuilder_internalErrors()) { free(dates); } if (localMsgs != messageBuilder_internalErrors()) { free(localMsgs); } }
MARPAWRAPPER_EXPORT void _genericLogger_defaultCallback(const void *userDatavp, const genericLoggerLevel_t leveli, const char *msgs) { /* We are NOT going to do a general log4c mechanism (this can come later) */ /* I.e. we are fixing the default output to be: DD/MM/YYYY hh::mm::ss PREFIX MESSAGE */ const char *prefixs = (leveli == GENERICLOGGER_LOGLEVEL_TRACE ) ? "TRACE" : (leveli == GENERICLOGGER_LOGLEVEL_DEBUG ) ? "DEBUG" : (leveli == GENERICLOGGER_LOGLEVEL_INFO ) ? "INFO" : (leveli == GENERICLOGGER_LOGLEVEL_NOTICE ) ? "NOTICE" : (leveli == GENERICLOGGER_LOGLEVEL_WARNING ) ? "WARNING" : (leveli == GENERICLOGGER_LOGLEVEL_ERROR ) ? "ERROR" : (leveli == GENERICLOGGER_LOGLEVEL_CRITICAL ) ? "CRITICAL" : (leveli == GENERICLOGGER_LOGLEVEL_ALERT ) ? "ALERT" : (leveli == GENERICLOGGER_LOGLEVEL_EMERGENCY) ? "EMERGENCY" : "UNKOWN"; char *dates = dateBuilder("%d/%m/%Y %H:%M:%S"); char *localMsgs = messageBuilder("%s %9s %s\n", dates, prefixs, (msgs != NULL) ? (char *) msgs : (char *) GENERICLOGGER_LOG_NO_MESSAGE); char *p = localMsgs; #ifdef FILENO int filenoStderr = FILENO(stderr); #ifdef SYS_FILENO_IS_FILENO ssize_t bytesWriten = 0; #else size_t bytesWriten = 0; #endif size_t count; #endif #ifdef FILENO count = strlen(p); while (bytesWriten < count) { bytesWriten += SYS_WRITE(filenoStderr, p+bytesWriten, count-bytesWriten); } #else /* Note: this is not asynchroneous safe */ fprintf(stderr, "%s", p); #endif if (dates != dateBuilder_internalErrors()) { free(dates); } if (localMsgs != messageBuilder_internalErrors()) { free(localMsgs); } }
static marpaWrapperBool_t myValueRuleCallback(const marpaWrapperUserData_t *marpaWrapperUserDatap, const marpaWrapperRecognizer_t *marpaWrapperRecognizerp, const marpaWrapperRule_t *marpaWrapperRulep, const size_t nValuepInputi, const marpaWrapperValuepArrayp_t valuepArrayInputp, marpaWrapperValuep_t *valuepOutputp) { int rulei; myStack_t *outputp = malloc(sizeof(myStack_t)); myStack_t **stackpp = (myStack_t **) valuepArrayInputp; if (outputp == NULL) { return MARPAWRAPPER_BOOL_FALSE; } rulei = (int) marpaWrapperRule_datavp_get(marpaWrapperRulep); switch (rulei) { case START_RULE: /* S ::= E */ outputp->string = messageBuilder("%s == %d", stackpp[0]->string, stackpp[0]->value); if (outputp->string == messageBuilder_internalErrors()) { free(outputp); return MARPAWRAPPER_BOOL_FALSE; } outputp->value = stackpp[0]->value; break; case NUMBER_RULE: /* E ::= number */ outputp->string = messageBuilder("%d", stackpp[0]->value); if (outputp->string == messageBuilder_internalErrors()) { free(outputp); return MARPAWRAPPER_BOOL_FALSE; } outputp->value = stackpp[0]->value; break; case OP_RULE: /* E ::= E op E */ outputp->string = messageBuilder("(%s%s%s)", stackpp[0]->string, stackpp[1]->string, stackpp[2]->string); if (outputp->string == messageBuilder_internalErrors()) { free(outputp); return MARPAWRAPPER_BOOL_FALSE; } switch (stackpp[1]->string[0]) { case '+': outputp->value = stackpp[0]->value + stackpp[2]->value; break; case '-': outputp->value = stackpp[0]->value - stackpp[2]->value; break; case '*': outputp->value = stackpp[0]->value * stackpp[2]->value; break; default: free(outputp); return MARPAWRAPPER_BOOL_FALSE; } break; default: free(outputp); return MARPAWRAPPER_BOOL_FALSE; } *valuepOutputp = outputp; return MARPAWRAPPER_BOOL_TRUE; }