#include "proc.h"
#ifdef __USECSTRINGS
#include "tokenize.h"
#include "fastpass.h"
#endif

ret_code InvokeDirective( int i, struct asm_tok tokenarray[] )
/************************************************************/
{
    struct asym    *sym;
    struct dsym    *proc;
    char	   *p;
    //char         *param;
    int 	   numParam;
    int 	   value;
    int 	   size;
    int 	   parmpos;
    int 	   namepos;
    int 	   porder;
    uint_8         r0flags = 0;
    bool	   uselabel = FALSE;
    struct proc_info *info;
    struct dsym    *curr;
    struct expr    opndx;
#ifdef __USECSTRINGS
    static labels = 0;
    int	  q,z,e,quote,lc;
    char  *p2,*lp;
    char  ch;
    char  label[64];
    char  line[MAX_LINE_LEN];
    char  data[MAX_LINE_LEN];
    char  buffer[MAX_LINE_LEN];
#endif
    DebugMsg1(("InvokeDir(%s) enter\n", tokenarray[i].tokpos ));

    i++; /* skip INVOKE directive */
    namepos = i;

#ifdef __USECSTRINGS
    if (Parse_Pass == PASS_1) {
	lp = LineStoreCurr->line;
	strcpy(line, lp);
	lp[0] = ';';
	lc = strcmp(line, tokenarray[0].tokpos);
	for (q = i; tokenarray[q].token != T_FINAL; q++) {
    	    if (tokenarray[q].string_ptr[0] == '"') {
	    	e = q + 1;
	    	quote = 0;
	    	sprintf(label, "DS%04u", labels++);
	    	p = tokenarray[q].string_ptr;
	    	z = 0;
	    	while (*p) {
		    if (*p == '\\') {
	  		p++;
			ch = *p /*| 0x20*/;
	  		switch (ch) {
	    		case '\'': buffer[z] = '\''; break;
	    		case '\\': buffer[z] = '\\'; break;
	    	    	case 't':  buffer[z] = '\t'; break;
	    	    	case 'n':  buffer[z] = '\n'; break;
	    	    	case 'r':  buffer[z] = '\r'; break;
	    	    	case '\"':
		    	    quote = ~(quote) & 1;
		    	    buffer[z++] = '\"';
			    buffer[z++] = ',';
			    buffer[z++] = '\'';
			    buffer[z++] = '\"';
			    buffer[z++] = '\'';
			    if (p[1] == 0) {
			    	p = tokenarray[e].string_ptr;
			    	e++;
			    	if (*p) {
			    	    buffer[z++] = ',';
				    buffer[z++] = '\"';
				    continue;
			    	}
			    	break;
			    }
			    buffer[z++] = ',';
			    buffer[z] = '\"';
			    break;
		    	default:
		    	    buffer[z] = *p;
			    break;
		    	}
		    } else {
			buffer[z] = *p;
		    }
		    z++;
		    if (*p) {
		    	p++;
		    	if (quote && *p == 0) {
			    p = tokenarray[e].string_ptr;
			    e++;
		    	}
		    }
	    	}
	    	buffer[z] = 0;
	    	if (lc != 0) {
		    if ((p = strstr(line, tokenarray[q].string_ptr)) != NULL) {
			p2 = p + strlen(tokenarray[q].string_ptr);
			while (*p2 == ' ' || p2 == '\t') p2++;
			if (!(*p2 == ',' || *p2 == ')')) {
		    	    if ((p2 = strrchr(p+1, '\"')) != NULL)
				p2++;
			}
			if (p2 != NULL) {
		    	    strcpy(data, p2);
		    	    strcpy(p, "addr ");
		    	    strcat(p, label);
		    	    strcat(p, data);
			}
		    }
	    	}
	    	sprintf(data, " %s db %s,0", label, buffer);
	    	tokenarray[q].tokpos[0] = 0;
	    	strcpy(buffer, tokenarray[0].tokpos);
	    	strcat(buffer, "addr ");
	    	strcat(buffer, label);
	    	if (tokenarray[e].token != T_FINAL) {
		    strcat(buffer, " ");
		    strcat(buffer, tokenarray[e].tokpos);
	    	}
		z = GeneratedCode;
    	    	GeneratedCode = 0;
	    	strcpy(CurrSource, ".data");
	    	Token_Count = Tokenize(CurrSource, 0, tokenarray, TOK_DEFAULT);
	    	ParseLine(tokenarray);
	    	strcpy(CurrSource, data);
	    	Token_Count = Tokenize(CurrSource, 0, tokenarray, TOK_DEFAULT);
	    	ParseLine(tokenarray);
	    	strcpy(CurrSource, ".code");
	    	Token_Count = Tokenize(CurrSource, 0, tokenarray, TOK_DEFAULT);
	    	ParseLine(tokenarray);
	    	GeneratedCode = z;
	    	strcpy(CurrSource, buffer);
	    	Token_Count = Tokenize(CurrSource, 0, tokenarray, TOK_DEFAULT);
	    	q = i;
	    }
	}
	if (lc == 0) {
	    StoreLine(CurrSource, list_pos, 0);
	} else {
	    z = GeneratedCode;
	    GeneratedCode = 0;
	    StoreLine(line, list_pos, 0);
	    GeneratedCode = z;
	}
    }
#endif
    /* if there is more than just an ID item describing the invoke target,
     use the expression evaluator to get it
     */
    if ( tokenarray[i].token != T_ID || ( tokenarray[i+1].token != T_COMMA && tokenarray[i+1].token != T_FINAL ) ) {
