9p / who / tweedy / 9C / 1


Exercise 1.19: Reverse Lines

Code

#include <u.h>
#include <libc.h>
#include <bio.h>

#define STDIN   0
#define MAXLINE 1000    /* maximum input line size */

int getline(Biobuf *buffer, char line[], int maxline);
void reverse(char original[], int len, char reversed[]);

/* print longest line */
void
main()
{
    int len;
    char line[MAXLINE];
    char reversed[MAXLINE];
    int i;

    Biobuf *bstdin;
    bstdin = Bfdopen(STDIN, OREAD);

    while((len = getline(bstdin, line, MAXLINE)) > 0){
        for(i=0; i<=MAXLINE; ++i)
            reversed[i]='\0';
        reverse(line, len, reversed);
        print("%s", reversed);
    }

    exits(0);
}

/* getline: read a line into s, return length */
int getline(Biobuf *b, char s[], int lim)
{
    int c, i;

    for(i = 0; i<lim-1 && (c=Bgetc(b))>= 0 && c!='\n'; ++i)
        s[i] = c;
    if(c == '\n'){
        s[i] = c;
        ++i;
    }
    s[i] = '\0';
    return i;
}

/* reverse: take 'original' and reverse it into 'reversed';
   we won't recalculate the lenth since getline() just did that */
void reverse(char original[], int len, char reversed[])
{
        int i, j;
        i = len - 1;
        j = 0;

        /* we don't want to reverse \n to the beginning of the line */
        if(original[i] == '\n'){
                reversed[i] = '\n';
                --i;
        }

        for(j = 0; i >= 0; --i, ++j)
                reversed[j] = original[i];
}

Output

$ 9c reverse.c; 9l reverse.o -o reverse
$ ./reverse < TEXT
            sbat eerht yb dewollof txet
   secaps eerht yb dewollof txet

TEXT

text followed by three tabs         
text followed by three spaces   




tweedy