BSD 3 development
[unix-history] / usr / src / cmd / sdb / fio.c
#include "head.h"
/*
* These procedures manage the source files examined by sdb.
*/
/* Change the current source file to `name'. */
finit(name)
char *name; {
register char *p, *q;
if (fiobuf.fd) close(fiobuf.fd);
q = name;
for (p=fp; *q; *p++ = *q++) ;
*p = 0;
if ((fiobuf.fd = open(filework,0)) == -1) {
nolines = 1;
perror(filework);
return;
}
binit(&fiobuf);
cpstr(curfile, name);
for (p=fbuf;;p++) {
if (bread(&fiobuf,p,1) <= 0) {
nolines = 1;
printf("%s: No lines in file\n", name);
return;
}
if (*p == '\n') break;
}
fline = 1;
maxfline = 0;
nolines = 0;
}
/* Make the next line current. */
fnext() {
register char *p;
if (nolines){
return;
}
for(p=fbuf;;p++) {
if (bread(&fiobuf,p,1) <= 0) {
p--;
blseek(&fiobuf,0L,0);
fline = 0;
continue;
}
if (*p == '\n') break;
}
fline++;
}
/* Make the previous line current. */
fprev() {
char c;
register int i;
if (nolines){
return;
}
for(i=0; i<3; i++) {
for (;;) {
if (bread(&fiobuf, &c+1, -1) <= 0) {
if (maxfline) blseek(&fiobuf,0L,2);
else {
blseek(&fiobuf,0L,0);
for(;;) {
if (bread(&fiobuf,&c,1)<=0)
break;
if (c == '\n') maxfline++;
}
}
}
if (c == '\n') break;
}
}
bread(&fiobuf, &c, 1); /* eat the '\n' */
fline -= 2;
if (fline < 0) fline = maxfline - 1;
fnext();
}
/* Print the current line. */
fprint() {
register char *p;
if (nolines){
error("No lines in file");
return;
}
printf("%d: ", fline);
p = fbuf;
while(putchar(*p++) != '\n')
;
}
/* Make line `num' current. */
ffind(num)
register int num; {
register int i, ofline;
if (nolines){
return;
}
ofline = fline;
if (num>fline)
for (i=fline; i<num; i++) {
fnext();
if (fline == 1) goto bad;
}
if (num<fline)
for (i=num; i<ofline; i++) {
fprev();
}
if (maxfline & num>maxfline) goto bad;
return;
bad: error("Not that many lines in file");
ffind(ofline);
}
/* Go back n lines. */
fback(n) {
int i;
if (nolines){
return(0);
}
for (i=0; i<n; i++) {
if (fline == 1) return(i);
fprev();
}
return(i);
}
/* Go forwards n lines. */
fforward(n) {
int i;
if (nolines){
return(0);
}
for (i=0; i<n; i++) {
fnext();
if (fline == 1) {
fprev();
return(i);
}
}
return(i);
}
/* Print n lines. */
fprintn(n) {
int i;
if (nolines){
error("No lines in file");
return(0);
}
for (i=0; i<n; i++) {
fprint();
fnext();
if (fline == 1) break;
}
fprev();
return(i);
}