/*
	Utility functions for word processor
*/

#include <macdefs.wp>
#include <globals.wp>

#define fputc putc	/* I keep getting it wrong */

/*
	copy title from buf to ttl
*/

gettl(buf,ttl)
	char *buf;
	char *ttl;
	{

	while ( ! isspace(*buf) )
	  buf++;
	while ( isspace(*buf) )
	  buf++;
	if ( *buf == '\'' || *buf == '"' )
	  buf++;
	strcpy(ttl,buf);
	}


/*
	space n lines or to bottom of page
*/

space(n)
	int n;
	{

	brk();
	if ( lineno > bottom )
	  return;
	if( lineno == 0 )
	  phead();
	skip(min(n,bottom+1-lineno));
	lineno += n;
	if ( lineno > bottom )
	  pfoot();
	}


/*
	put out a line with proper spacing and indenting
*/

put(buf)
	char buf[];
	{
	int i;

	if ( lineno == 0 || lineno > bottom )
	  phead();
	for ( i=0; i < tival; i++ )
	  fputc(' ',outfile);
	tival = inval;
	fputs(buf,outfile);
	skip(min(lsval-1,bottom-lineno));
	lineno += lsval;
	if ( lineno > bottom )
	  pfoot();
	}


/*
	delete leading blanks and set tival
*/

leadbl(buf)
	char buf[];
	{
	int i;

	brk();
	for ( i = 0; buf[i] == ' '; i++ )
	  ;
	if ( buf[i] != '\n' )
	  tival = i;
	strcpy(buf,&buf[i]);
	}




/*
	put out page header
*/

phead()
	{

	curpag = newpag++;
	if ( m1val > 0 ) {
	  skip(m1val-1);
	  puttl(header,curpag);
	  }
	skip(m2val);
	lineno = m1val + m2val + 1;
	}



/*
	put out page footer
*/

pfoot()
	{

	skip(m3val);
	if ( m4val > 0 )
	  puttl(footer,curpag);
	skip(m4val-1);
	lineno = 0;
	}



/*
	put out title line with optional page number
*/

puttl(buf,pageno)
	char *buf;
	int pageno;
	{
	char c;

	while ( c = *buf++ )
	  if ( c == '#' )
	    fprintf(outfile,"%4d",pageno);
	  else
	    fputc(c,outfile);
	}

/*
	get a non-blank word from in[i] to out[]
	and advance i
	return length of out[]
*/

getwrd(in,i,out)
	char in[];
	int *i;
	char out[];
	{
	int ii;
	int j;
	char c;

	ii = *i;
	while ( (c=in[ii]) == ' ' || c == '\t' )
	  ++ii;
	j = 0;
	while ( (c=in[ii]) != ' ' && c != '\t' && c != '\n' && c != '\0' )
	  out[j++] = in[ii++];
	out[j] = '\0';
	*i = ii;
	return j;
	}


/*
	output n blank lines
*/

skip(n)
	int n;
	{
	int i;

	for ( i = 0; i < n; i++ ) {
	  putc('\r',outfile);
	  putc('\n',outfile);
	  }
	}



/*
	minimum of two arguments
*/

min(a,b)
	int a;
	int b;
	{
	return a < b ? a : b;
	}



/*
	maximum of two arguments
*/

max(a,b)
	int a;
	int b;
	{
	return a > b ? a : b;
	}


/*
	compare strings for equality
	make upper and lower case equivalent
*/

samestr(str1,str2)
	char *str1,*str2;
	{
	while ( *str1 )
	  if ( toupper(*str1++) != toupper(*str2++) )
	    return 0;
	if ( *str2 != '\0' )
	  return 0;
	return 1;
	}


/*	-------------------------------------------------------

	Name:		index(s,t)
	Result:		position of s in t
	Errors:		notfound
	Globals:	---
	Macros:		---
	Procedures:

	Action:		Return the position (index) in the
			string s where string t begins,
			or -1 if s doesn't contain t.
			Uses 0 as starting position in s

	------------------------------------------------------- */

index(s, t)
	char s[], t[];
	{
	int i, j, k;

	for (i = 0; s[i] != '\0'; i++) {
	  for (j=i, k=0; t[k]!='\0' && s[j]==t[k]; j++, k++)
	    ;
	  if (t[k] == '\0')
	    return(i);
	  }
	return -1;
	}
