/* Raise a fatal error condition. */ void AG_FatalError(const char *fmt, ...) { va_list args; char *buf; /* Use callback if defined. The callback must gracefully exit. */ if (agErrorCallback != NULL) { if (fmt != NULL) { va_start(args, fmt); Vasprintf(&buf, fmt, args); va_end(args); agErrorCallback(buf); abort(); /* not reached */ } else { agErrorCallback(AG_GetError()); abort(); /* not reached */ } } else { fprintf(stderr, "Fatal error: "); if (fmt != NULL) { va_start(args, fmt); vfprintf(stderr, fmt, args); va_end(args); } else { fprintf(stderr, "%s", AG_GetError()); } fprintf(stderr, "\n"); abort(); } }
/* Issue a debug message. */ void AG_Debug(void *p, const char *fmt, ...) { #ifdef AG_DEBUG AG_Object *obj = p; va_list args; if (obj != NULL && obj->debugFn != NULL) { char *buf, *p; va_start(args, fmt); Vasprintf(&buf, fmt, args); p = &buf[strlen(buf)-1]; if (*p == '\n') { *p = '\0'; } obj->debugFn(obj, obj->debugPtr, buf); Free(buf); va_end(args); } else { if (agDebugLvl >= 1 || (obj != NULL && OBJECT_DEBUG(obj))) { va_start(args, fmt); if (obj != NULL) { if (OBJECT(obj)->name[0] != '\0') { printf("%s: ", OBJECT(obj)->name); } else { printf("<%p>: ", obj); } } vprintf(fmt, args); va_end(args); } } #endif /* AG_DEBUG */ }
AG_Label * AG_StatusbarAddLabel(AG_Statusbar *sbar, const char *fmt, ...) { AG_Label *lab; va_list ap; AG_ObjectLock(sbar); #ifdef AG_DEBUG if (sbar->nlabels+1 >= AG_STATUSBAR_MAX_LABELS) AG_FatalError("AG_StatusbarAddLabel: Too many labels"); #endif sbar->labels[sbar->nlabels] = Malloc(sizeof(AG_Label)); lab = sbar->labels[sbar->nlabels]; AG_ObjectInit(lab, &agLabelClass); lab->type = AG_LABEL_STATIC; va_start(ap, fmt); Vasprintf(&lab->text, fmt, ap); va_end(ap); AG_ExpandHoriz(lab); AG_ObjectAttach(&sbar->box, lab); lab = sbar->labels[sbar->nlabels++]; AG_ObjectUnlock(sbar); AG_Redraw(sbar); return (lab); }
/* Set the textbox label (format string). */ void AG_TextboxSetLabel(AG_Textbox *tb, const char *fmt, ...) { char *s; va_list ap; va_start(ap, fmt); Vasprintf(&s, fmt, ap); va_end(ap); AG_TextboxSetLabelS(tb, s); Free(s); }
AG_Button * AG_ButtonNew(void *parent, Uint flags, const char *fmt, ...) { va_list ap; char *s; if (fmt != NULL) { va_start(ap, fmt); Vasprintf(&s, fmt, ap); va_end(ap); } else { s = NULL; } return AG_ButtonNewS(parent, flags, s); }
/* Set the label text (format string). */ void AG_BoxSetLabel(AG_Box *box, const char *fmt, ...) { char *s; va_list ap; if (fmt != NULL) { va_start(ap, fmt); Vasprintf(&s, fmt, ap); va_end(ap); AG_BoxSetLabelS(box, s); free(s); box->flags |= AG_BOX_FRAME; } else { AG_BoxSetLabelS(box, NULL); box->flags &= ~(AG_BOX_FRAME); } }
/* Set the error message string. */ void AG_SetError(const char *fmt, ...) { va_list args; char *buf; va_start(args, fmt); Vasprintf(&buf, fmt, args); va_end(args); #ifdef AG_THREADS { char *ekey; if ((ekey = (char *)AG_ThreadKeyGet(agErrorKey)) != NULL) { Free(ekey); } AG_ThreadKeySet(agErrorKey, buf); } #else Free(agErrorKey); agErrorKey = buf; #endif }