[BACK]Return to utils.c CVS log [TXT][DIR] Up to [local] / src / usr.bin / aucat

Annotation of src/usr.bin/aucat/utils.c, Revision 1.1

1.1     ! ratchov     1: /*     $OpenBSD$       */
        !             2: /*
        !             3:  * Copyright (c) 2003-2012 Alexandre Ratchov <alex@caoua.org>
        !             4:  *
        !             5:  * Permission to use, copy, modify, and distribute this software for any
        !             6:  * purpose with or without fee is hereby granted, provided that the above
        !             7:  * copyright notice and this permission notice appear in all copies.
        !             8:  *
        !             9:  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
        !            10:  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
        !            11:  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
        !            12:  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
        !            13:  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
        !            14:  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
        !            15:  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
        !            16:  */
        !            17: /*
        !            18:  * log_xxx() routines are used to quickly store traces into a trace buffer.
        !            19:  * This allows trances to be collected during time sensitive operations without
        !            20:  * disturbing them. The buffer can be flushed on standard error later, when
        !            21:  * slow syscalls are no longer disruptive, e.g. at the end of the poll() loop.
        !            22:  */
        !            23: #include <signal.h>
        !            24: #include <stdlib.h>
        !            25: #include <string.h>
        !            26: #include <unistd.h>
        !            27: #include <fcntl.h>
        !            28: #include "utils.h"
        !            29:
        !            30: /*
        !            31:  * log buffer size
        !            32:  */
        !            33: #define LOG_BUFSZ      8192
        !            34:
        !            35: /*
        !            36:  * store a character in the log
        !            37:  */
        !            38: #define LOG_PUTC(c) do {                       \
        !            39:        if (log_used < LOG_BUFSZ)               \
        !            40:                log_buf[log_used++] = (c);      \
        !            41: } while (0)
        !            42:
        !            43: char log_buf[LOG_BUFSZ];       /* buffer where traces are stored */
        !            44: unsigned int log_used = 0;     /* bytes used in the buffer */
        !            45: unsigned int log_sync = 1;     /* if true, flush after each '\n' */
        !            46:
        !            47: /*
        !            48:  * write the log buffer on stderr
        !            49:  */
        !            50: void
        !            51: log_flush(void)
        !            52: {
        !            53:        if (log_used ==  0)
        !            54:                return;
        !            55:        write(STDERR_FILENO, log_buf, log_used);
        !            56:        log_used = 0;
        !            57: }
        !            58:
        !            59: /*
        !            60:  * store a string in the log
        !            61:  */
        !            62: void
        !            63: log_puts(char *msg)
        !            64: {
        !            65:        char *p = msg;
        !            66:        int c;
        !            67:
        !            68:        while ((c = *p++) != '\0') {
        !            69:                LOG_PUTC(c);
        !            70:                if (log_sync && c == '\n')
        !            71:                        log_flush();
        !            72:        }
        !            73: }
        !            74:
        !            75: /*
        !            76:  * store a hex in the log
        !            77:  */
        !            78: void
        !            79: log_putx(unsigned long num)
        !            80: {
        !            81:        char dig[sizeof(num) * 2], *p = dig, c;
        !            82:        unsigned int ndig;
        !            83:
        !            84:        if (num != 0) {
        !            85:                for (ndig = 0; num != 0; ndig++) {
        !            86:                        *p++ = num & 0xf;
        !            87:                        num >>= 4;
        !            88:                }
        !            89:                for (; ndig != 0; ndig--) {
        !            90:                        c = *(--p);
        !            91:                        c += (c < 10) ? '0' : 'a' - 10;
        !            92:                        LOG_PUTC(c);
        !            93:                }
        !            94:        } else
        !            95:                LOG_PUTC('0');
        !            96: }
        !            97:
        !            98: /*
        !            99:  * store a unsigned decimal in the log
        !           100:  */
        !           101: void
        !           102: log_putu(unsigned long num)
        !           103: {
        !           104:        char dig[sizeof(num) * 3], *p = dig;
        !           105:        unsigned int ndig;
        !           106:
        !           107:        if (num != 0) {
        !           108:                for (ndig = 0; num != 0; ndig++) {
        !           109:                        *p++ = num % 10;
        !           110:                        num /= 10;
        !           111:                }
        !           112:                for (; ndig != 0; ndig--)
        !           113:                        LOG_PUTC(*(--p) + '0');
        !           114:        } else
        !           115:                LOG_PUTC('0');
        !           116: }
        !           117:
        !           118: /*
        !           119:  * store a signed decimal in the log
        !           120:  */
        !           121: void
        !           122: log_puti(long num)
        !           123: {
        !           124:        if (num < 0) {
        !           125:                LOG_PUTC('-');
        !           126:                num = -num;
        !           127:        }
        !           128:        log_putu(num);
        !           129: }
        !           130:
        !           131: /*
        !           132:  * abort program execution after a fatal error
        !           133:  */
        !           134: void
        !           135: panic(void)
        !           136: {
        !           137:        log_flush();
        !           138:        (void)kill(getpid(), SIGABRT);
        !           139:        _exit(1);
        !           140: }
        !           141:
        !           142: /*
        !           143:  * allocate a (small) abount of memory, and abort if it fails
        !           144:  */
        !           145: void *
        !           146: xmalloc(size_t size)
        !           147: {
        !           148:        void *p;
        !           149:
        !           150:        p = malloc(size);
        !           151:        if (p == NULL) {
        !           152:                log_puts("failed to allocate ");
        !           153:                log_putx(size);
        !           154:                log_puts(" bytes\n");
        !           155:                panic();
        !           156:        }
        !           157:        return p;
        !           158: }
        !           159:
        !           160: /*
        !           161:  * free memory allocated with xmalloc()
        !           162:  */
        !           163: void
        !           164: xfree(void *p)
        !           165: {
        !           166:        free(p);
        !           167: }
        !           168:
        !           169: /*
        !           170:  * xmalloc-style strdup(3)
        !           171:  */
        !           172: char *
        !           173: xstrdup(char *s)
        !           174: {
        !           175:        size_t size;
        !           176:        void *p;
        !           177:
        !           178:        size = strlen(s) + 1;
        !           179:        p = xmalloc(size);
        !           180:        memcpy(p, s, size);
        !           181:        return p;
        !           182: }