Changeset 138939 for trunk/base


Ignore:
Timestamp:
Jul 24, 2015, 10:26:49 AM (5 years ago)
Author:
raimue@…
Message:

pextlib: Move implementation of ui_* wrappers from tracelib to Pextlib, replacing the previous implementation

Location:
trunk/base/src/pextlib1.0
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/base/src/pextlib1.0/Pextlib.c

    r138165 r138939  
    106106#endif
    107107
    108 static char *
    109 ui_escape(const char *source)
    110 {
    111     char *d, *dest;
    112     const char *s;
    113     size_t dlen;
    114 
    115     s = source;
    116     dlen = strlen(source) * 2 + 1;
    117     d = dest = malloc(dlen);
    118     if (dest == NULL) {
    119         return NULL;
    120     }
    121     while(*s != '\0') {
    122         switch(*s) {
    123             case '\\':
    124             case '}':
    125             case '{':
    126                 *d = '\\';
    127                 d++;
    128                 *d = *s;
    129                 d++;
    130                 s++;
    131                 break;
    132             case '\n':
    133                 s++;
    134                 break;
    135             default:
    136                 *d = *s;
    137                 d++;
    138                 s++;
    139                 break;
    140         }
    141     }
    142     *d = '\0';
    143     return dest;
    144 }
    145 
    146 int
    147 ui_info(Tcl_Interp *interp, char *mesg)
    148 {
    149     const char ui_proc_start[] = "ui_info [subst -nocommands -novariables {";
    150     const char ui_proc_end[] = "}]";
    151     char *script, *string;
    152     size_t scriptlen, len, remaining;
    153     int rval;
    154 
    155     string = ui_escape(mesg);
    156     if (string == NULL)
    157         return TCL_ERROR;
    158 
    159     len = strlen(string);
    160     scriptlen = sizeof(ui_proc_start) + len + sizeof(ui_proc_end) - 1;
    161     script = malloc(scriptlen);
    162     if (script == NULL)
    163         return TCL_ERROR;
    164 
    165     memcpy(script, ui_proc_start, sizeof(ui_proc_start));
    166     remaining = scriptlen - sizeof(ui_proc_start);
    167     strncat(script, string, remaining);
    168     remaining -= len;
    169     strncat(script, ui_proc_end, remaining);
    170     free(string);
    171     rval = Tcl_EvalEx(interp, script, -1, 0);
    172     free(script);
    173     return rval;
     108__printflike(3, 0)
     109static void ui_message(Tcl_Interp *interp, const char *severity, const char *format, va_list va) {
     110    char buf[1024], tclcmd[32];
     111
     112    vsnprintf(buf, sizeof(buf), format, va);
     113
     114    snprintf(tclcmd, sizeof(tclcmd), "ui_%s $warn", severity);
     115
     116    Tcl_SetVar(interp, "warn", buf, 0);
     117    if (TCL_OK != Tcl_Eval(interp, tclcmd)) {
     118        fprintf(stderr, "Error evaluating tcl statement `%s': %s\n", tclcmd, Tcl_GetStringResult(interp));
     119    }
     120    Tcl_UnsetVar(interp, "warn", 0);
     121}
     122
     123__printflike(2, 3)
     124void ui_error(Tcl_Interp *interp, const char *format, ...) {
     125    va_list va;
     126    va_start(va, format);
     127    ui_message(interp, "error", format, va);
     128    va_end(va);
     129}
     130
     131__printflike(2, 3)
     132void ui_warn(Tcl_Interp *interp, const char *format, ...) {
     133    va_list va;
     134
     135    va_start(va, format);
     136    ui_message(interp, "warn", format, va);
     137    va_end(va);
     138}
     139
     140__printflike(2, 3)
     141void ui_msg(Tcl_Interp *interp, const char *format, ...) {
     142    va_list va;
     143    va_start(va, format);
     144    ui_message(interp, "msg", format, va);
     145    va_end(va);
     146}
     147
     148__printflike(2, 3)
     149void ui_notice(Tcl_Interp *interp, const char *format, ...) {
     150    va_list va;
     151
     152    va_start(va, format);
     153    ui_message(interp, "notice", format, va);
     154    va_end(va);
     155}
     156
     157__printflike(2, 3)
     158void ui_info(Tcl_Interp *interp, const char *format, ...) {
     159    va_list va;
     160
     161    va_start(va, format);
     162    ui_message(interp, "info", format, va);
     163    va_end(va);
     164}
     165
     166__printflike(2, 3)
     167void ui_debug(Tcl_Interp *interp, const char *format, ...) {
     168    va_list va;
     169
     170    va_start(va, format);
     171    ui_message(interp, "debug", format, va);
     172    va_end(va);
    174173}
    175174
  • trunk/base/src/pextlib1.0/Pextlib.h

    r53831 r138939  
    3131 */
    3232
    33 int ui_info(Tcl_Interp *, char *);
     33void ui_error(Tcl_Interp *interp, const char *format, ...) __printflike(2, 3);
     34void ui_warn(Tcl_Interp *interp, const char *format, ...) __printflike(2, 3);
     35void ui_msg(Tcl_Interp *interp, const char *format, ...) __printflike(2, 3);
     36void ui_notice(Tcl_Interp *interp, const char *format, ...) __printflike(2, 3);
     37void ui_info(Tcl_Interp *interp, const char *format, ...) __printflike(2, 3);
     38void ui_debug(Tcl_Interp *interp, const char *format, ...) __printflike(2, 3);
  • trunk/base/src/pextlib1.0/tracelib.c

    r127659 r138939  
    6464#include "tracelib.h"
    6565
     66#include "Pextlib.h"
     67
    6668#include "strlcat.h"
    6769
     
    106108} sandbox_violation_t;
    107109static void sandbox_violation(int sock, const char *path, sandbox_violation_t type);
    108 
    109 static void ui_warn(const char *format, ...) __printflike(1, 2);
    110 #if 0
    111 static void ui_info(const char *format, ...) __printflike(1, 2);
    112 #endif
    113 static void ui_error(const char *format, ...) __printflike(1, 2);
    114110
    115111#define MAX_SOCKETS (1024)
     
    421417
    422418    if (NULL == (reg = registry_for(interp, reg_attached))) {
    423         ui_error("%s", Tcl_GetStringResult(interp));
     419        ui_error(interp, "%s", Tcl_GetStringResult(interp));
    424420        /* send unexpected output to make the build fail */
    425421        answer(sock, "#");
     
    439435    if (!reg_entry_propget(&entry, "name", &port, &error)) {
    440436        /* send unexpected output to make the build fail */
    441         ui_error("%s", error.description);
     437        ui_error(interp, "%s", error.description);
    442438        answer(sock, "#");
    443439    }
     
    456452}
    457453
    458 __printflike(2, 0)
    459 static void ui_msg(const char *severity, const char *format, va_list va) {
    460     char buf[1024], tclcmd[32];
    461 
    462     vsnprintf(buf, sizeof(buf), format, va);
    463 
    464     snprintf(tclcmd, sizeof(tclcmd), "ui_%s $warn", severity);
    465 
    466     Tcl_SetVar(interp, "warn", buf, 0);
    467     if (TCL_OK != Tcl_Eval(interp, tclcmd)) {
    468         fprintf(stderr, "Error evaluating tcl statement `%s': %s\n", tclcmd, Tcl_GetStringResult(interp));
    469     }
    470     Tcl_UnsetVar(interp, "warn", 0);
    471 
    472 }
    473 
    474 __printflike(1, 2)
    475 static void ui_warn(const char *format, ...) {
    476     va_list va;
    477 
    478     va_start(va, format);
    479     ui_msg("warn", format, va);
    480     va_end(va);
    481 }
    482 
    483 #if 0
    484 __printflike(1, 2)
    485 static void ui_info(const char *format, ...) {
    486     va_list va;
    487 
    488     va_start(va, format);
    489     ui_msg("info", format, va);
    490     va_end(va);
    491 }
    492 #endif
    493 
    494 __printflike(1, 2)
    495 static void ui_error(const char *format, ...) {
    496     va_list va;
    497     va_start(va, format);
    498     ui_msg("error", format, va);
    499     va_end(va);
    500 }
    501 
    502454static int TracelibOpenSocketCmd(Tcl_Interp *in) {
    503455    struct sockaddr_un sun;
     
    521473     * of 256 */
    522474    if (getrlimit(RLIMIT_NOFILE, &rl) == -1) {
    523         ui_warn("getrlimit failed (%d), skipping setrlimit", errno);
     475        ui_warn(interp, "getrlimit failed (%d), skipping setrlimit", errno);
    524476    } else {
    525477#ifdef OPEN_MAX
     
    530482        rl.rlim_cur = rl.rlim_max;
    531483        if (setrlimit(RLIMIT_NOFILE, &rl) == -1) {
    532             ui_warn("setrlimit failed (%d)", errno);
     484            ui_warn(interp, "setrlimit failed (%d)", errno);
    533485        }
    534486    }
     
    721673                    flags = fcntl(s, F_GETFL, 0);
    722674                    if (-1 == fcntl(s, F_SETFL, flags & ~O_NONBLOCK)) {
    723                         ui_warn("tracelib: couldn't mark socket as blocking");
     675                        ui_warn(interp, "tracelib: couldn't mark socket as blocking");
    724676                        close(s);
    725677                        continue;
     
    729681                    EV_SET(&kev, s, EVFILT_READ, EV_ADD | EV_RECEIPT, 0, 0, NULL);
    730682                    if (1 != kevent(kq, &kev, 1, &kev, 1, NULL)) {
    731                         ui_warn("tracelib: error adding socket to kqueue");
     683                        ui_warn(interp, "tracelib: error adding socket to kqueue");
    732684                        close(s);
    733685                        continue;
     
    737689                     * will be zero. */
    738690                    if ((kev.flags & EV_ERROR) == 0 || ((kev.flags & EV_ERROR) > 0 && kev.data != 0)) {
    739                         ui_warn("tracelib: error adding socket to kqueue");
     691                        ui_warn(interp, "tracelib: error adding socket to kqueue");
    740692                        close(s);
    741693                        continue;
Note: See TracChangeset for help on using the changeset viewer.