Add libString.
This commit is contained in:
parent
57ccfb9e8f
commit
7f11104a57
20 changed files with 1315 additions and 0 deletions
72
src/libString/s_getline.c
Normal file
72
src/libString/s_getline.c
Normal file
|
|
@ -0,0 +1,72 @@
|
|||
#include <u.h>
|
||||
#include <libc.h>
|
||||
#include <bio.h>
|
||||
#include "libString.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);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue