## root/libutil/strbuf.h(165.html)

/* [<][>][^][v][top][bottom][index][help] */

## INCLUDED FROM

    /*
     * Copyright (c) 1997, 1998, 1999, 2000, 2002, 2005, 2006
     *      Tama Communications Corporation
     *
     * This file is part of GNU GLOBAL.
     *
     * This program is free software: you can redistribute it and/or modify
     * it under the terms of the GNU General Public License as published by
     * the Free Software Foundation, either version 3 of the License, or
     * (at your option) any later version.
     *
     * This program is distributed in the hope that it will be useful,
     * but WITHOUT ANY WARRANTY; without even the implied warranty of
     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     * GNU General Public License for more details.
     *
     * You should have received a copy of the GNU General Public License
     * along with this program.  If not, see <http://www.gnu.org/licenses/>.
     */

    #ifndef _STRBUF_H
    #define _STRBUF_H

    #include <stdio.h>
    #ifdef HAVE_STRING_H
    #include <string.h>
    #else
    #include <strings.h>
    #endif
    #include <stdarg.h>

    #ifndef __attribute__
    /* This feature is available in gcc versions 2.5 and later.  */
    # if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 5) || __STRICT_ANSI__
    #  define __attribute__(x)
    # endif
    /* The __-protected variants of `format' and `printf' attributes
       are accepted by gcc versions 2.6.4 (effectively 2.7) and later.  */
    # if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 7)
    #  define __format__ format
    #  define __printf__ printf
    # endif
    #endif

    #define INITIALSIZE 80
    #define EXPANDSIZE 80

    /* for strbuf_fgets() */
    #define STRBUF_APPEND   1
    #define STRBUF_NOCRLF   2

    typedef struct _strbuf {
            char *name;
            char *sbuf;
            char *endp;
            char *curp;
            int sbufsize;
            int alloc_failed;
    } STRBUF;

    /*
     * STATIC_STRBUF(sb):
     *
     * This macro is used for static string buffer which is suitable for
     * work area and(or) return value of function. The area allocated once
     * is repeatedly used though the area is never released.
     * You must call strbuf_clear(sb) every time before using.
     * You must not call strbuf_close(sb) for it.
     *
     * Usage:
     *      function(...) {
     *              STATIC_STRBUF(sb);
     *
     *              strbuf_clear(sb);
     *              ...
     *              strbuf_puts(sb, "xxxxx");
     *              ...
     *              return strbuf_value(sb);
     *      }
     */
    #define STATIC_STRBUF(sb) static STRBUF sb[1]

    #define strbuf_empty(sb) (sb->sbufsize == 0)

    #define strbuf_putc(sb, c)      do {\
            if (!sb->alloc_failed) {\
                    if (sb->curp >= sb->endp)\
                            __strbuf_expandbuf(sb, 0);\
                    *sb->curp++ = c;\
            }\
    } while (0)

    #define strbuf_puts0(sb, s) do {\
            strbuf_puts(sb, s);\
            strbuf_putc(sb, '\0');\
    } while (0)

    #define strbuf_getlen(sb) (sb->curp - sb->sbuf)
    #define strbuf_setlen(sb, len) do {\
            unsigned int _length = len;\
            if (!sb->alloc_failed) {\
                    if (_length < strbuf_getlen(sb))\
                            sb->curp = sb->sbuf + _length;\
                    else if (_length > strbuf_getlen(sb))\
                            __strbuf_expandbuf(sb, _length - strbuf_getlen(sb));\
            }\
    } while (0)
    #define strbuf_lastchar(sb) (*(sb->curp - 1))

    #ifdef DEBUG
    void strbuf_dump(char *);
    #endif
    void __strbuf_expandbuf(STRBUF *, int);
    STRBUF *strbuf_open(int);
    void strbuf_reset(STRBUF *);
    void strbuf_clear(STRBUF *);
    void strbuf_nputs(STRBUF *, const char *, int);
    void strbuf_nputc(STRBUF *, int, int);
    void strbuf_puts(STRBUF *, const char *);
    void strbuf_puts_nl(STRBUF *, const char *);
    void strbuf_putn(STRBUF *, int);
    int strbuf_unputc(STRBUF *, int);
    char *strbuf_value(STRBUF *);
    void strbuf_trim(STRBUF *);
    void strbuf_close(STRBUF *);
    char *strbuf_fgets(STRBUF *, FILE *, int);
    void strbuf_sprintf(STRBUF *sb, const char *s, ...)
            __attribute__ ((__format__ (__printf__, 2, 3)));
    STRBUF *strbuf_open_tempbuf(void);
    void strbuf_release_tempbuf(STRBUF *);

    #endif /* ! _STRBUF_H */

/* [<][>][^][v][top][bottom][index][help] */