tRewrote most of the program for reliability sake - skroll - scroll a text to stdout
 (HTM) git clone git://z3bra.org/skroll
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit 0460798513da19fc70269a3cac23247e0963ddbc
 (DIR) parent 6bcf0623ab602150ec9cc0dfe06313f663a2d33a
 (HTM) Author: z3bra <willy@mailoo.org>
       Date:   Tue, 28 Oct 2014 09:29:44 +0100
       
       Rewrote most of the program for reliability sake
       
       Diffstat:
         M skroll.c                            |     113 ++++++++++---------------------
       
       1 file changed, 34 insertions(+), 79 deletions(-)
       ---
 (DIR) diff --git a/skroll.c b/skroll.c
       t@@ -26,95 +26,48 @@
        
        static bool newline = false;/* print a new line after each step */
        static bool loop = false;   /* wether to loop text or not */
       -static float delay = 0.5;   /* scroll speed, in seconds */
       -static int number = 10;     /* number of chars to be shown at the same time */
       +static float delay = 0.1;   /* scroll speed, in seconds */
       +static int number = 20;     /* number of chars to be shown at the same time */
        
       -/* fills a string with spaces if it has less than <num> chars */
       -void zero_fill (char **str, size_t num)
       -{
       -    int c;
       -    size_t s;
       -
       -    s = strnlen((*str),num);
       -
       -    /* check every char of the buffer */
       -    for (c=0; c<num; ++c) {
       -        /* if the char is a new line, or if the string is to small */
       -        if ( (*str)[c] == '\n' || c >= s ) {
       -            /* replace current char with a space */
       -            (*str)[c] = ' ';
       -        }
       -    }
       -
       -    /* double-check your pointers */
       -    (*str)[num] = 0;
       -
       -    return; /* void */
       -}
       -
       -/* pad string <pad> string with <num> spaces and fill out to <len> with <str> */
       -void zero_pad (char **pad, const char *str, size_t len, size_t num)
       +/* scroll <input> to stdout */
       +void skroll (const char *input)
        {
       +    int offset, buflen = 0;
       +    char *buf = NULL;
        
       -    /* pad the string with 0x20 (space char) */
       -    memset ( (*pad), 0x20, num );
       +    buflen = strnlen( input, BUFFER_SIZE ) + ( number * 2 ) + 1;
        
       -    /* append char of the *original* string at the end of the pad */
       -    strncat ( (*pad), str, len );
       +    buf = calloc( buflen, sizeof( char ) );
        
       -    /* fill the stirng with spaces, in case it's too short */
       -    zero_fill ( pad, len );
       +    if ( buf == NULL )
       +    {
       +        return;
       +    }
        
       -    return; /* void */
       -}
       +    /* initialize memory with "spaces" and null-terminate the buffer */
       +    memset( buf, 0x20, buflen - 1 );
       +    buf[ buflen - 1 ] = 0;
        
       -/* scroll <input> to stdout */
       -void skroll (const char *input)
       -{
       -    int offset, padder;
       -    char *buf = NULL;
       +    /* copy input at place `number` */
       +    memcpy( buf + number, input, strlen( input ) );
        
       -    if ( !(buf = calloc (number, sizeof(char))) ) return;
       -    buf[number] = 0;
       +    /* remove \n from input string to sanitize output */
       +    if ( buf[ number + strlen( input ) - 1 ] == '\n' )
       +    {
       +        buf[ number + strlen( input ) - 1 ] = 0x20; 
       +    }
        
            /* main loop. will loop forever if run with -l */
            do {
        
                offset = 0;
       -        padder = number;
        
                /* loop executed on each step, after <delay> seconds */
       -        while ( input[offset] != 0 ) {
       -
       -            /* fill the memory with zeros */
       -            memset ( buf, 0, number );
       -
       -            /*
       -             * There are two different parts: padding, and filling.
       -             * padding is adding spaces at the beginning to simulate text
       -             * arrival from the right. filling is adding spaces at the end of
       -             * the text so that the currently displayed text has always the
       -             * same size, even if there is only a single char
       -             */
       -            if ( padder > 0 ) {
       -                /* 
       -                 * While the first letter has not reach the left edge, pad the
       -                 * text, decrementing padding after each step.
       -                 */
       -                zero_pad(&buf, input, number, padder);
       -                padder--;
       -            /* Once padding is finished, we start "hiding" text to the left */
       -            } else {
       -                /* copy the number of char we want to the buffer */
       -                strncpy(buf, input + offset, number);
       -
       -                /* fill missing chars with spaces */
       -                zero_fill(&buf, number);
       -                offset++;
       -            }
       -
       -            /* print out the buffer ! */
       -            printf("\r%s", buf);
       +        while ( buf [ offset + number ] != 0 ) {
       +
       +            /* print out `number` characters from the buffer ! */
       +            putc( '\r', stdout );
       +            write( 1, buf + offset, number );
        
                    /* if we want a new line, let's do it here */
                    if (newline) putc('\n', stdout);
       t@@ -122,13 +75,11 @@ void skroll (const char *input)
                    /* flush stdout, and wait for the next step */
                    fflush(stdout);
                    usleep(delay*1000000);
       +            offset++;
                }
            /* magnolia ? FOWEVA ! */
            } while(loop);
        
       -    /* And with a new line, no matter what */
       -    putc('\n', stdout);
       -
            return; /* void */
        }
        
       t@@ -138,8 +89,9 @@ const char *bufferize (FILE *stream)
            char *buf = NULL;
        
            /* allocate space to store the input */
       -    if ( !(buf = calloc (BUFFER_SIZE, sizeof(char))) ) return NULL;
       -    buf[BUFFER_SIZE] = 0;
       +    if ( !(buf = calloc (BUFFER_SIZE + 1, sizeof(char))) ) return NULL;
       +    /* buf[BUFFER_SIZE] = 0; */
       +    memset( buf, 0, BUFFER_SIZE + 1 );
        
            /* OMG, NO MORE SPACE LEFT ON DEVICE (or no more input, in fact) */
            if ( feof(stream) || !fgets(buf, BUFFER_SIZE, stream) ) {
       t@@ -173,5 +125,8 @@ int main (int argc, char **argv)
                skroll(buf);
            }
        
       +    /* End with a new line, no matter what */
       +    putc('\n', stdout);
       +
            return 0;
        }