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