#include #include #include #include #include "spho/ctx.h" static const char *spho_ctx_sys_strerror(struct spho_ctx *); static const char *spho_ctx_intern_strerror(struct spho_ctx *); struct spho_err { int err; const char *msg; }; struct spho_err spho_errmsgs[] = { { SPHO_ERR_SYS, "spho system error" }, { SPHO_ERR_INTERNAL, "spho internal error" }, { SPHO_ERR_TOOBIG, "parameter size too big" }, { SPHO_ERR_ARGINVAL, "invalid argument" }, { SPHO_ERR_NAMEINUSE, "name in use" }, { -1, NULL } }; struct spho_ctx * spho_ctx_create(void) { struct spho_ctx *c; c = NULL; if ((c = malloc(sizeof(struct spho_ctx))) == NULL) return (NULL); c->err = 0; c->err_info = 0; if (spho_scope_init(&c->glob, c, NULL) == -1) { free(c); return (NULL); } SPHO_POSTCOND(c != NULL); return (c); } void spho_ctx_destroy(struct spho_ctx *ctx) { SPHO_PRECOND(ctx != NULL); spho_scope_term(&ctx->glob); free(ctx); } const char * spho_ctx_strerror(struct spho_ctx *ctx) { int res; const char *msg; SPHO_PRECOND(ctx != NULL); msg = NULL; if (SPHO_ERR_IS_SYSERR(ctx->err)) msg = spho_ctx_sys_strerror(ctx); else msg = spho_ctx_intern_strerror(ctx); SPHO_POSTCOND(msg != NULL); return (msg); } static const char * spho_ctx_sys_strerror(struct spho_ctx *ctx) { int res; SPHO_POSTCOND(ctx != NULL); #ifdef SPHO_DEBUG res = snprintf(ctx->errbuf, sizeof(ctx->errbuf), "%s:%d:spho_syserr:%s (%d)", ctx->filebuf, ctx->errline, strerror(ctx->err_info), ctx->err_info); if (res >= sizeof(ctx->errbuf)) ctx->errbuf[sizeof(ctx->errbuf) - 1] = '\0'; #else res = snprintf(ctx->errbuf, sizeof(ctx->errbuf), "spho_syserr:%s (%d)", strerror(ctx->err_info), ctx->err_info); if (res >= sizeof(ctx->errbuf)) ctx->errbuf[sizeof(ctx->errbuf) - 1] = '\0'; #endif return (ctx->errbuf); } static const char * spho_ctx_intern_strerror(struct spho_ctx *ctx) { int i; int res; SPHO_PRECOND(ctx != NULL); for (i = 0; spho_errmsgs[i].msg != NULL; i++) { if (spho_errmsgs[i].err == ctx->err) { #ifdef SPHO_DEBUG res = snprintf(ctx->errbuf, sizeof(ctx->errbuf), "%s:%d:spho_intern_err:%s", ctx->filebuf, ctx->errline, spho_errmsgs[i].msg); #else res = snprintf(ctx->errbuf, sizeof(ctx->errbuf), "spho_intern_err:%s", ctx->errbuf); #endif } } SPHO_POSTCOND(res != -1); return (ctx->errbuf); }