shithub: kandr

ref: 91fc7321c2b7df934036f7b88ffdd5d6c826e941
dir: /ex/ex1-20.c/

View raw version
#include <u.h>
#include <libc.h>
#include <bio.h>

void
usage(void)
{
	fprint(2, "usage: %s [-t tabstop]", argv0);
	exits("usage");
}

/* 
Replace tabs with 'tabstop' number of spaces. 
*/
void
main(int argc, char *argv[])
{
	int tabstop = 4;
	Biobuf	*in, *out;
	char *aux;

	ARGBEGIN{
	case 't':
		aux = EARGF(usage());
		tabstop = atoi(aux);
		break;
	default:
		usage();
	}ARGEND

	in = Bfdopen(0, OREAD);
	out = Bfdopen(1, OWRITE);

	while(1){
		char *line;
		int len, n, i;

		// Read
		line = Brdline(in, '\n');
		len = Blinelen(in);
		if(line == 0)
			break;
		if(len < 0)
			sysfatal("err: could not read line → %r\n");

		int ind = -1;
		for(i = 0; i < len-1; i++){
			if(line[i] != ' ' && line[i] != '	'){
				ind = i;
				break;
			}

			if(line[i] == '	'){
				int j;
				for(j = 0; j < tabstop; j++)
					Bwrite(out, " ", 1);
			}
		}

		// Write
		char *begin = line;
		int end = len;

		if(ind > 0){
			ind++;
			begin = line+ind-1;
			end = len-ind+1;
		}

		n = Bwrite(out, begin, end);
		if(n < 0)
			sysfatal("err: could not write line → %r\n");
	}

	Bterm(in);
	Bterm(out);

	exits(nil);
}