skroll

text scroller
git clone git://git.2f30.org/skroll
Log | Files | Refs | README | LICENSE

commit 0460798513da19fc70269a3cac23247e0963ddbc
parent 6bcf0623ab602150ec9cc0dfe06313f663a2d33a
Author: z3bra <willy@mailoo.org>
Date:   Tue, 28 Oct 2014 09:29:44 +0100

Rewrote most of the program for reliability sake

Diffstat:
Mskroll.c | 113++++++++++++++++++++++++-------------------------------------------------------
1 file changed, 34 insertions(+), 79 deletions(-)

diff --git a/skroll.c b/skroll.c @@ -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); @@ -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 */ } @@ -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) ) { @@ -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; }