#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);
       }
}