tIntroducing 'smooth scrolling'. text now starts from the right and scrolls from here - 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 1a40c6b37cd6aec6c0e0694d95b2bf43a7d51a96
 (DIR) parent e5cfcfc2a35661baa401312bc9506fd3e3069b7d
 (HTM) Author: z3bra <willy@mailoo.org>
       Date:   Wed,  3 Sep 2014 17:10:28 +0200
       
       Introducing 'smooth scrolling'. text now starts from the right and scrolls from here
       
       Diffstat:
         M skroll.c                            |      60 +++++++++++++++++++++++++++----
       
       1 file changed, 53 insertions(+), 7 deletions(-)
       ---
 (DIR) diff --git a/skroll.c b/skroll.c
       t@@ -26,7 +26,7 @@
        
        static bool newline = false;/* print a new line after each step */
        static bool loop = false;   /* wether to loop text or not */
       -static float delay = 1;     /* scroll speed, in usec */
       +static float delay = 0.5;   /* scroll speed, in seconds */
        static int number = 10;     /* number of chars to be shown at the same time */
        
        /* fills a string with spaces if it has less than <num> chars */
       t@@ -52,22 +52,68 @@ void zero_fill (char **str, size_t num)
            return; /* void */
        }
        
       +/* 
       + * pad a string with <num> spaces, and append chars from <str> to it, until its
       + * lenght is <len>
       + */ 
       +void zero_pad (char **pad, const char *str, size_t len, size_t num)
       +{
       +    /* fill the memory with zeros */
       +    memset ( (*pad), 0, len );
       +
       +    /* pad the string with 0x20 (space char) */
       +    memset ( (*pad), 0x20, num );
       +
       +    /* append char of the *original* string at the end of the pad */
       +    strncat ( (*pad), str, len );
       +
       +    /* fill the stirng with spaces, in case it's too short */
       +    zero_fill ( pad, len );
       +
       +    return; /* void */
       +}
       +
        /* scroll <input> to stdout */
        void skroll (const char *input)
        {
       -    int offset = 0;
       +    int offset, padder;
            char *buf = NULL;
        
            if ( !(buf = calloc (number, sizeof(char))) ) return;
            buf[number] = 0;
        
       +    /* main loop. will loop forever if run with -l */
            do {
       -        for (offset=0; input[offset]; ++offset) {
       -            /* copy the number of char we want to the buffer */
       -            strncpy(buf, input + offset, number-1);
        
       -            /* fill missing chars with spaces */
       -            zero_fill(&buf, number);
       +        offset = 0;
       +        padder = number;
       +
       +        /* loop executed on each step, after <delay> seconds */
       +        while ( input[offset] != 0 ) {
       +            /*
       +             * 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--;
       +            } else
       +            /* Once padding is finished, we start "hiding" text to the left */
       +            if ( offset < number ) {
       +                /* copy the number of char we want to the buffer */
       +                strncpy(buf, input + offset, number-1);
       +
       +                /* fill missing chars with spaces */
       +                zero_fill(&buf, number);
       +                offset++;
       +            }
        
                    /* print out the buffer ! */
                    printf("\r%s", buf);