9p / who / tweedy / 9C / 1


Longest Line (external variables)

Code

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

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

int max;        /* maximum length so far */
char line[MAXLINE]; /* current input line */
char longest[MAXLINE];  /* longest line saved here */
Biobuf *bstdin;

int getline(void);
void copy(void);

/* print longest input line; specialized version */
void
main()
{
    int len;
    extern int max;
    extern char longest[];
    extern Biobuf *bstdin;
    bstdin = Bfdopen(STDIN, OREAD);

    max = 0;
    while((len = getline()) > 0)
        if(len > max) {
            max = len;
            copy();
        }
    if(max > 0) /* there was a line */
        print("%s", longest);

    exits(0);
}

/* getline: specialized version */
int getline()
{
    int c, i;
    extern char line[];

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

/* copy: specialized version */
void copy()
{
    int i;
    extern char line[], longest[];

    i = 0;
    while((longest[i] = line[i]) != '\0')
        ++i;
}

Output

$ 9c longest_ext.c; 9l longest_ext.o -o longest_ext
$ ./longest_ext < longest_ext.c
char longest[MAXLINE];  /* longest line saved here */



tweedy