Subversion Repositories planix.SVN

Rev

Blame | Last modification | View Log | RSS feed

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

/* Append an input line to a String.
 *
 * Returns a pointer to the character string (or 0).
 * Leading whitespace and newlines are removed.
 *
 * Empty lines and lines starting with '#' are ignored.
 */ 
extern char *
s_getline(Biobuf *fp, String *to)
{
        int c;
        int len=0;

        s_terminate(to);

        /* end of input */
        if ((c = Bgetc(fp)) < 0)
                return 0;

        /* take care of inconsequentials */
        for(;;) {
                /* eat leading white */
                while(c==' ' || c=='\t' || c=='\n' || c=='\r')
                        c = Bgetc(fp);

                if(c < 0)
                        return 0;

                /* take care of comments */
                if(c == '#'){
                        do {
                                c = Bgetc(fp);
                                if(c < 0)
                                        return 0;
                        } while(c != '\n');
                        continue;
                }

                /* if we got here, we've gotten something useful */
                break;
        }

        /* gather up a line */
        for(;;) {
                len++;
                switch(c) {
                case -1:
                        s_terminate(to);
                        return len ? to->ptr-len : 0;
                case '\\':
                        c = Bgetc(fp);
                        if (c != '\n') {
                                s_putc(to, '\\');
                                s_putc(to, c);
                        }
                        break;
                case '\n':
                        s_terminate(to);
                        return len ? to->ptr-len : 0;
                default:
                        s_putc(to, c);
                        break;
                }
                c = Bgetc(fp);
        }
}