af426c7aa40aad4c5c6b532b02a1151dd42da305 galt Wed Jun 4 15:17:14 2014 -0700 Inside an errCatch block warnings which are not followed by an errAbort just get swallowed up and ignored. I added a flag to the structure that remembers that warnings have occurred. diff --git src/lib/errCatch.c src/lib/errCatch.c index eedadfd..adf13a4 100644 --- src/lib/errCatch.c +++ src/lib/errCatch.c @@ -67,60 +67,73 @@ return (struct errCatch **)(&hel->val); } static void errCatchAbortHandler() /* semiAbort */ { struct errCatch **pErrCatchStack = getStack(), *errCatchStack = *pErrCatchStack; errCatchStack->gotError = TRUE; longjmp(errCatchStack->jmpBuf, -1); } static void errCatchWarnHandler(char *format, va_list args) /* Write an error to top of errCatchStack. */ { struct errCatch **pErrCatchStack = getStack(), *errCatchStack = *pErrCatchStack; +errCatchStack->gotWarning = TRUE; dyStringVaPrintf(errCatchStack->message, format, args); dyStringAppendC(errCatchStack->message, '\n'); } boolean errCatchPushHandlers(struct errCatch *errCatch) /* Push error handlers. Not usually called directly. */ { pushAbortHandler(errCatchAbortHandler); pushWarnHandler(errCatchWarnHandler); struct errCatch **pErrCatchStack = getStack(); slAddHead(pErrCatchStack, errCatch); return TRUE; } void errCatchEnd(struct errCatch *errCatch) /* Restore error handlers and pop self off of catching stack. */ { popWarnHandler(); popAbortHandler(); struct errCatch **pErrCatchStack = getStack(), *errCatchStack = *pErrCatchStack; if (errCatch != errCatchStack) errAbort("Mismatch between errCatch and errCatchStack"); *pErrCatchStack = errCatch->next; } +void errCatchReWarn(struct errCatch *errCatch) +/* Re-warn any warnings that happened even though no abort happened + * to make them visible. */ +{ +if (errCatch->gotWarning && !errCatch->gotError) + { + warn("%s", errCatch->message->string); + } +} + boolean errCatchFinish(struct errCatch **pErrCatch) /* Finish up error catching. Report error if there is a * problem and return FALSE. If no problem return TRUE. * This handles errCatchEnd and errCatchFree. */ { struct errCatch *errCatch = *pErrCatch; boolean ok = TRUE; if (errCatch != NULL) { errCatchEnd(errCatch); if (errCatch->gotError) { ok = FALSE; warn("%s", errCatch->message->string); } + else + errCatchReWarn(errCatch); errCatchFree(pErrCatch); } return ok; }