Platon Technologies
not logged in Login Registration
EnglishSlovak
open source software development celebrating 10 years of open source development! Saturday, March 7, 2026

File: [Platon] / scripts / ep / tbuffer / tbuffer.c (download)

Revision 1.5, Wed Jul 16 16:09:20 2003 UTC (22 years, 7 months ago) by nepto


Changes since 1.4: +1 -1 lines

Changed string "Platon software development group"
to "Platon Software Development Group".

#include <stdio.h>
#include <errno.h>
#include <stdlib.h>
#include <string.h>
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>

#define DEBUG    0

/* Value of 1 is minimum for both constants. */
#define DEFAULT_BUFSIZE 50000
#define DEFAULT_TIMEOUT 100

#define exit(n) { free(buf); exit(n); }

/*** __discolor ************************************************/
#ifndef __discolor
#define __discolor

#include <ctype.h>

#ifndef __strdel
#define __strdel
char*strdel(char*s){
    register int k=-1;
    while(++k,s[k]!='\0')s[k]=s[k+1];
    return(s);
}
#endif // #ifndef __strdel

char *discolor(char *s)
{
    register int i = 0;

    while (s[i] != '\0'){
        if (s[i] == '\033' && s[i+1] == '[') {
            while (s[i] != '\0' && !isalpha(s[i]))
                strdel(s+i);
            if (s[i] != '\0')
                strdel(s+i);
        }
        else
            i++;
    }

    return s;
}

int discolor_data(char *s, int size)
{
    register int i;

    for (i = 0; i < size + 1; ) {
        if (s[i] == '\033' && s[i + 1] == '[') {
            /*
               while (i < size && !isalpha(s[i])) {
               memmove(s + i, s + i + 1, size - i - 1);
               size--;
               }
               if (i < size) {
               memmove(s + i, s + i + 1, size - i - 1);
               size--;
               }
               */
            register char*tmp_s;

            tmp_s = memchr(s + i, 'm', size - i);

            if (tmp_s != NULL) {
                memmove(s + i, tmp_s + 1, size - (tmp_s - s));

                size -= (tmp_s + 1) - (s + i);
            }
            else {
                i++;
            }
        }
        else {
            i++;
        }
    }

    return size;
}

#endif


int main(int argc, char**argv)
{
    fd_set rfds;
    struct timeval tv;
    char *buf = NULL;
    register int retval, datasize, written, f_ending_eoln;
    register int timeout = 0, bufsize = 0;

    if (argc > 1) {
        register int cur = 1;

        while (cur < argc) {
            if (!strcmp(argv[cur], "-h") || !strcmp(argv[cur], "--help")) {
                printf("TBUFFER - timeout buffering v1.0 / %s %s\n",
                        __DATE__, __TIME__);
                printf("Programmed by Ondrej Jombik, "
                        "e-mail: Nepto@pobox.sk, "
                        "Web: http://Nepto.w3.to\n"
                        "(c) Copyright 2001 Platon Software Development Group, "
                        "All rights reserved.");
                printf("\n\nUsage: tbuffer\n"
                        "          [ -h | --help ]\n"
                        "          [ -t | --timeout <msec> ]\n"
                        "          [ -b | --bufsize <bytes> ]\n");

                return 1;
            }

            if (!strcmp(argv[cur], "-t") || !strcmp(argv[cur], "--timeout")) {
                cur++;
                timeout = atoi(argv[cur]);
                if (timeout <= 0) {
                    fprintf(stderr, "tbuffer: bad timeout defined [%d]\n",
                            timeout);

                    return 1;
                }
                cur++;
                break;
            }

            if (!strcmp(argv[cur], "-b") || !strcmp(argv[cur], "--bufsize")) {
                cur++;
                bufsize = atoi(argv[cur]);
                if (bufsize <= 1) {
                    fprintf(stderr, "tbuffer: bad buffer size defined [%d]\n",
                            bufsize);

                    return 1;
                }
                cur++;
                break;
            }

            fprintf(stderr, "tbuffer: invalid parameter '%s'\n", argv[cur]);
            return 1;
        }
    }

    if (bufsize > 1)
        fprintf(stderr, "tbuffer: using choosen buffer size of %d bytes\n",
                bufsize);
    else {
        bufsize = DEFAULT_BUFSIZE;
        fprintf(stderr, "tbuffer: using default buffer size of %d bytes\n",
                bufsize);
    }

    if (timeout != 0)
        fprintf(stderr, "tbuffer: using choosen timeout %d miliseconds\n",
                timeout);
    else {
        timeout = DEFAULT_TIMEOUT;
        fprintf(stderr, "tbuffer: using default timeout %d miliseconds\n",
                timeout);
    }

    f_ending_eoln = 1;

    buf = (char*) malloc(bufsize * sizeof(char));
    if (buf == NULL) {
        fprintf(stderr, "tbuffer: not enough memory to allocate "
                "buffer of size %d bytes\n", bufsize);
        return 1;
    }


    while(1) {

        /* Watch stdin (fd 0) to see when it has input. */
        FD_ZERO(&rfds);
        FD_SET(0, &rfds);

        /* Wait up to five seconds. */
        tv.tv_sec = 0;
        tv.tv_usec = timeout;

        retval = select(1, &rfds, NULL, NULL, &tv);

        switch (retval) {

            /* Error */
            case -1:
                fprintf(stderr, "tbuffer: select() failure: %s\n",
                        strerror(errno));
                exit(1);
                break;

                /* Timeout expired */
            case 0:
                if (f_ending_eoln == 0) {
                    f_ending_eoln = 1;

                    //switch (write(1, "<]\n[>", 5)) {
                    switch (write(1, "\n", 1)) {

                        /* Error */
                        case -1:
                            fprintf(stderr, "tbuffer: write() failure: %s",
                                    strerror(errno));
                            exit(1);
                            break;

                            /* unknow situation */
                        case 0:
                            fprintf(stderr, "tbuffer: write() = 0, "
                                    "all OK, terminating...\n");
                            exit(0);
                            break;

                        default:
                            break;
                    };
                }
                break;

                    default:
                /* This should be 1.
                 * It means number of changed descriptors in select().
                 */

                /* Read data to descriptor 0. */
                /* ssize_t read(int fd, void *buf, size_t count); */
                /*
                 * We must use bufsize - 1 cause we need last character
                 * to append '\0' and make normal NUL terminated string.
                 */
                datasize = read(0, buf, bufsize - 1);
                switch (datasize) {

                    /* Error */
                    case -1:
                        fprintf(stderr, "tbuffer: read() failure: %s\n",
                                strerror(errno));
                        exit(1);
                        break;

                        /* unknown situation */
                    case 0:
                        fprintf(stderr, "tbuffer: read() = 0, "
                                "all OK, terminating...\n");
                        exit(0);
                        break;

                    default:

#if DEBUG
                        {
                            char tmpbuf[100];
                            sprintf(tmpbuf, "\n\033[01;34mtbuffer-debug:"
                                    " \033[0mread() OK, datasize = %d\n",
                                    datasize);
                            write(1, tmpbuf, strlen(tmpbuf));
                        }
#endif

                        /* Write data to descriptor 1 */
                        written = write(1, buf, datasize);

                        if (written != datasize) {
                            char tmpbuf[100];
                            sprintf(tmpbuf, "tbuffer-warning: "
                                    "written != datasize (%d != %d)\n",
                                    written, datasize);
                            write(1, tmpbuf, strlen(tmpbuf));
                        }

                        switch (written) {

                            /* Error */
                            case -1:
                                fprintf(stderr,
                                        "tbuffer: write() failure: %s\n",
                                        strerror(errno));
                                exit(1);
                                break;

                                /* unknown situation */
                            case 0:
                                fprintf(stderr, "tbuffer: write() = 0, "
                                        "all OK, terminating...\n");
                                exit(0);
                                break;

                            default:

#if DEBUG
                                {
                                    char tmpbuf[200];
                                    register int k;

                                    sprintf(tmpbuf, "\n\033[01;34m"
                                            "tbuffer-debug:\033[0m "
                                            "write() OK, datasize = %d\n",
                                            datasize);
                                    write(1, tmpbuf, strlen(tmpbuf));
#endif

#if 0
                                    buf[datasize] = '\0';
                                    discolor(buf);
                                    datasize = strlen(buf);
#else
                                    datasize = discolor_data(buf, datasize);
                                    //write(1, buf, datasize);
#endif

#if DEBUG
                                    sprintf(tmpbuf,
                                            "\033[01;34mtbuffer-debug:"
                                            "\033[0m "
                                            "datasize after discolor() = "
                                            "%d\n", datasize);     
                                    write(1, tmpbuf, strlen(tmpbuf));
#endif

                                    if (datasize > 0) {
                                        if (buf[datasize-1] == '\n')
                                            f_ending_eoln = 1;
                                        else
                                            f_ending_eoln = 0;
                                    }
                                    /* // Toto tu nechceme
                                       else
                                       f_ending_eoln = 0;
                                       */
#if DEBUG
                                    strcpy(tmpbuf, "\033[01;34mtbuffer-debug:"
                                            "\033[0m [BEG]");
                                    for (k = datasize-9 > 0 ? datasize-9 : 0;
                                            k < datasize; k++) {
                                        sprintf(strchr(tmpbuf, '\0'), "[%X:%c]",
                                                buf[k],buf[k]>=32?buf[k]:'_');
                                    }

                                    strcat(tmpbuf, "[END]\n");
                                    write(1, tmpbuf, strlen(tmpbuf));
                                }
#endif
                                break;

                        }; /* switch(write()) */

                        break;
                }; /* switch(read()) */

                break;
                }; /* switch (select()) */
        }

        return 0;
    }


Platon Group <platon@platon.org> http://platon.org/
Copyright © 2002-2006 Platon Group
Site powered by Metafox CMS
Go to Top