#include <stdio.h>
#include <ctype.h>
#include "make.h"

static char *stripwh ();

/*
 * Get next token from the string.  Return a pointer to it, or NULL.
 * Adjust pointer to point to next part of string.
 * The string is modified.
 * A token consists of any number of non-white characters.
 */

char *token (strpp)
char **strpp;
{
    register char *s;
    register char *beg = NULL;

    DBUG_ENTER ("token");
    DBUG_3 ("tok", "get next token from '%s'", *strpp);
    (void) stripwh (strpp);
    if (**strpp) {
	beg = s = *strpp;
	while (*s && !isspace (*s)) {
	    ++s;
	}
	if (*s) {
	    *s++ = '\0';
	}
	*strpp = s;
	DBUG_3 ("tok", "found token '%s'", beg);
    }
    DBUG_RETURN (beg);
}


/*
 * Parse character escape-sequences in a line of text.
 *	<EscChar><EscChar> = <EscChar>
 *	<EscChar>n = newline, and so on
 *	<EscChar><char> = <char>
 * The string is truncated at the first non-escaped occurance of 'comchar'.
 */

void escape (str, comchar)
char *str;
char comchar;
{
    register char *d;
    register char c;

    DBUG_ENTER ("escape");
    for (d = str; *str && *str != comchar; ++str) {
	if (*str == ESCCHAR && *(str + 1)) {
	    switch ((c = *++str)) {
		case ESCCHAR: 
		    *d++ = ESCCHAR;
		    break;
		case 'n': 
		    *d++ = '\n';
		    break;
		case 'r': 
		    *d++ = '\r';
		    break;
		case 't': 
		    *d++ = '\t';
		    break;
		case 'b': 
		    *d++ = '\b';
		    break;
		case 'f': 
		    *d++ = '\f';
		    break;
		default: 
		    *d++ = c;
		    break;
	    }
	} else {
	    *d++ = *str;
	}
    }
    *d++ = 0;
    DBUG_VOID_RETURN;
}

static char *stripwh (strpp)
char **strpp;
{
    register char *s;

    s = *strpp;
    while (isspace (*s)) {
	++s;
    }
    return (*strpp = s);
}
