Пример #1
0
int main(int argc, char *argv[]) {
	FILE *theJFile;
	FILE *theASMFile;
	char token[200];

	theJFile = fopen(argv[1], "r");
	fileName = malloc(strlen(argv[1]) + 2);
	strncpy(fileName, argv[1], strlen(argv[1]) - 2);
	
	theASMFile = fopen(strcat(fileName, ".asm"), "w");
	strncpy(fileName, argv[1], strlen(argv[1]) - 4);
	
	/*fputs("\t.CODE\n", theASMFile);
	fputs("\t.ADDR 0x0000\n", theASMFile);
	fputs("STACK_START .UCONST 0x7FFF\n", theASMFile);
	fputs("\tLC R6 STACK_START\n\tLC R5 STACK_START\n", theASMFile);*/

	while(!feof(theJFile)) {
		readToken(theJFile, token);
		handleToken(theJFile, theASMFile, token);
	}
	/*fputs("\t.OS\n\t.CODE\n\t.ADDR 0x8200\n\tRTI\n", theASMFile);*/
	free(fileName);
	return 0;

}
Пример #2
0
void HttpDaemon :: readClient()
{
  QTcpSocket *socket = (QTcpSocket*) sender();
  if (socket->canReadLine()) {
    QStringList tokens = QString(socket->readLine()).split(QRegExp("[ \r\n][ \r\n]*"));
    handleToken(tokens, socket);
    if (socket->state() == QTcpSocket::UnconnectedState) {
      delete socket;
    }
  }
}
Пример #3
0
// Handle single char from input
void handleChar(char c) {
    if(c == ' ' || c == '\n') {
        if(bufferLength > 0) {
            // A space or newline, and not empyt buffer, so a new token is ready
            handleToken();
        }
    }
    else {
        // Not space or newline, we add it to the current token
        buffer[bufferLength] = c;
        bufferLength++;
    }
}
Пример #4
0
// {{{ Message Management
// {{{ handleMessage
int handleMessage(msg_t msg) {
	switch (type(msg)) {
		case REQUEST:
			return handleRequest(msg);
		case TOKEN:
			return handleToken(msg);
		case HELLO:
			return handleHello(msg);
		case HELLOREP:
			return handleHelloRep(msg, NULL);
		default:
			fprintf(stderr, "======> Uknown message type <======\n");
			return -1;
	}
}
Пример #5
0
bool Parser::parse(QString pattern)
{
    if(!pattern.isEmpty())
        setExpression(pattern);

    for(std::vector<Token *>::iterator iter = _tokens.begin(); iter != _tokens.end(); ++iter)
        delete *iter;

    _tokens.clear();

    int previousPositon = 0;
    while(_pos < pattern.length())
    {
        handleToken(findMatch());

        // In the case where no progress is being made, exit returning false
        if(previousPositon == _pos)
            return false;

        previousPositon = _pos;
    }

    return true;
}
Пример #6
0
// {{{ critSectionRequest
// Ask for critical section
int critSectionRequest() {
	msg_t msg;
	type(msg) = REQUEST;
	char *ip_tmp = inet_ntoa(this_site.neighbours[0].sin_addr);
	strncpy (ask(msg), ip_tmp, IPLONG);

	// If already in SC just return -1
	if (state != IDLE) {
		if (_verbose) fprintf (stderr,"Already in critical section.\n");
		return -1;
	}
	state = WAITING;

	// Owns Token ?
	if(tokenPresent) 
		return takeCriticalSection();
	// Sends request to last
	else if(last != -1) {
		// Get ip of last
		char *tmpter = getIPstrFromNb (last);
		if (_verbose) fprintf (stdout, "Last is %d, sending it a request.\n", last);
		strncpy(ip(msg), tmpter, IPLONG);
		free (tmpter);

		strncpy (ask(msg), inet_ntoa(this_site.neighbours[0].sin_addr), IPLONG);

		if(sendMessageWithAdd(msg) == -1){
			if (_verbose) fprintf (stderr, "======> Sending request failure... <======\n");
			return -1;
		}

		// Arms a timer
		time_t timeStart, timeCur;
		int flags = fcntl(this_site.sdRecv, F_GETFL);
		int flags2 = flags | O_NONBLOCK;
		fcntl(this_site.sdRecv, F_SETFL, flags2);

		timeStart = time(&timeStart);
		timeCur = time(&timeCur);

		// Wait for an answer
		if (_verbose) fprintf (stdout, "Waiting for COMMIT.\n");
		while(timeCur - timeStart < (2*TMESG)) {
			timeCur = time(&timeCur);

			if(recvMessage(&msg, NULL) == -1) 
				continue;

			if (type(msg) == COMMIT)
				return handleCommit(msg);
			else {
				// TODO: Work on reaction when receiving request while waiting commit
				if (type(msg) == REQUEST) {
					if (_verbose) fprintf (stdout, "Received a REQUEST instead of a COMMIT.\n");
				}
				else if (type(msg) == TOKEN){
					last = -1;
					return handleToken(msg);
				}
				else
					handleMessage(msg);
			}
		}

		// If receive no answers
		if (_verbose) fprintf (stdout, "I didn't get any COMMIT, looking for the queue...\n");
		fcntl(this_site.sdRecv, F_SETFL, flags);

		memset (&msg, 0, SIZE);
		type(msg) = SEARCH_QUEUE;
		nb_acc(msg) = acces;
		// Broadcast Search_Queue
		if (_verbose) fprintf (stdout, "Broadcasting SEARCH_QUEUE.\n");
		broadcast(msg);

		msg_t max;
		pos(max) = -1;

		fcntl(this_site.sdRecv, F_SETFL, flags2);

		timeStart = time(&timeStart);
		timeCur = time(&timeCur);

		// Wait for ACK_SEARCH_QUEUE
		if (_verbose) fprintf (stdout, "Expecting ACK_SEARCH_QUEUE.\n");
		while(timeCur - timeStart < 2*TMESG) {
			timeCur = time(&timeCur);
			memset (&msg, 0, SIZE);

			if(recvMessage(&msg, NULL) == -1) 
				continue;

			switch(type(msg)) {
				case ACK_SEARCH_QUEUE:
					if (_verbose) fprintf (stdout, "Got an ACK_SEARCH_QUEUE.\n");
					// Save greatest position in the queue
					if (pos(msg) > pos(max)) {
						if (_verbose) fprintf (stdout, "New position in QUEUE : %d.\n", pos(msg));
						memcpy(&max, &msg, SIZE);
					}
					break;
					// Another site discovers the failure
				case SEARCH_QUEUE:
					if (isMe(ips(msg)))
						continue;
					if (_verbose) fprintf (stdout, "Another site discovered the failure.\n");
					// The other site hasn't priority, just continue
					if (nb_acc(msg) > acces) 
						continue;
					// Both of sites have the same numbers of access, defines priority with ip
					if (nb_acc(msg) == acces) {
						char *ip_pers = inet_ntoa(this_site.neighbours[0].sin_addr);
						if (strcmp(ip_pers, ips(msg)) <= 0)
							continue;
					}
					// If the other has the priority, just change last and ask it for CS
					unsigned long int ipa = (unsigned long int) inet_addr(ips(msg));
					last = getNeighbour(ipa);
					if (_verbose) fprintf (stdout, "I don't have priority, changing my last (%d) and asking for CS again.\n", last);
					state = IDLE;
					return critSectionRequest();
					// TODO: Request processing
				case REQUEST:
					break;
				default:
					handleMessage(msg);
					break;
			}
		}

		if (_verbose) fprintf (stdout, "Waiting time passed.\n");

		fcntl(this_site.sdRecv, F_SETFL, flags);

		// No other site in the queue, juste regenerate TOKEN
		if (pos(max) < 0) {
			if (_verbose) fprintf (stdout, "No other sites in the queue, regenerate TOKEN (last = next)\n");
			last = next;
			tokenPresent = 1;
			takeCriticalSection();
		}
		else {
			// Ask for connection to the site with the highest position
			unsigned long int ipa = (unsigned long int) inet_addr(ips(max));
			last = getNeighbour(ipa);
			if (_verbose) fprintf (stdout, "Ask for Connection, new last = %d\n", last);
			strncpy(ip(msg), ips(max),IPLONG *sizeof(char));
			if (next(max)) {
				type(msg) = CONNECTION;
				if (sendMessageWithAdd(msg) == -1)
					return -1;
			}
			state = IDLE;
			critSectionRequest();
		}
	}
	else
		if (_verbose) fprintf (stderr, "======> Last = -1, but don't have TOKEN <======\n");
	return 0;
}
Пример #7
0
void handleToken(FILE *inStream, FILE *outStream, char *token) {
	int n;
	char name[200];
	int starting_index;
	int hasElse = 0;
	int endif = 0;
	if(strcmp(token, "+") == 0) {
		fputs("\tLDR R0 R6 #0\n", outStream);	// get values off top of stack
		fputs("\tLDR R1 R6 #1\n", outStream);
		fputs("\tADD R0 R0 R1\n", outStream);	// add and store in R0
		fputs("\tADD R6 R6 #1\n", outStream);	// update SP
		fputs("\tSTR R0 R6 #0\n", outStream); 	// push return value onto top of stack
	}
	else if(strcmp(token, "-") == 0) {
		fputs("\tLDR R0 R6 #0\n", outStream);	// get values off top of stack
		fputs("\tLDR R1 R6 #1\n", outStream);
		fputs("\tSUB R0 R0 R1\n", outStream);	// subtract and store in R0
		fputs("\tADD R6 R6 #1\n", outStream);	// update SP
		fputs("\tSTR R0 R6 #0\n", outStream); 	// push return value onto top of stack
	}
	else if(strcmp(token, "*") == 0) {
		fputs("\tLDR R0 R6 #0\n", outStream);	// get values off top of stack
		fputs("\tLDR R1 R6 #1\n", outStream);
		fputs("\tMUL R0 R0 R1\n", outStream);	// multiply and store in R0
		fputs("\tADD R6 R6 #1\n", outStream);	// update SP
		fputs("\tSTR R0 R6 #0\n", outStream); 	// push return value onto top of stack
	}
	else if(strcmp(token, "/") == 0) {
		fputs("\tLDR R0 R6 #0\n", outStream);	// get values off top of stack
		fputs("\tLDR R1 R6 #1\n", outStream);
		fputs("\tDIV R0 R0 R1\n", outStream);	// divide and store in R0
		fputs("\tADD R6 R6 #1\n", outStream);	// update SP
		fputs("\tSTR R0 R6 #0\n", outStream); 	// push return value onto top of stack
	}
	else if(strcmp(token, "%") == 0) {
		fputs("\tLDR R0 R6 #0\n", outStream);	// get values off top of stack
		fputs("\tLDR R1 R6 #1\n", outStream);
		fputs("\tMOD R0 R0 R1\n", outStream);	// mod and store in R0
		fputs("\tADD R6 R6 #1\n", outStream);	// update SP
		fputs("\tSTR R0 R6 #0\n", outStream); 	// push return value onto top of stack
	}
	else if(strcmp(token, "lt") == 0) {
		fputs("\tLDR R0 R6 #0\n", outStream);	// get a
		fputs("\tLDR R1 R6 #1\n", outStream); 	// get b
		fputs("\tADD R6 R6 #1\n", outStream); 	// update SP
		fputs("\tCMP R0 R1\n", outStream); 	// a - b
		fprintf(outStream, "\tBRn %s_comp_%d\n", fileName, comp_index);		// if negative, skip next 2 lines
		fputs("\tCONST R0 #0\n", outStream);	// false, so want to return 0
		fprintf(outStream, "\tBRnzp %s_comp_%d\n", fileName, comp_index + 1);		// skip next line
		fprintf(outStream, "%s_comp_%d", fileName, comp_index);
		fputs("\tCONST R0 #1\n", outStream);	// true, so want to return 1
		fprintf(outStream, "%s_comp_%d\n", fileName, comp_index + 1);
		comp_index++;
		fputs("\tSTR R0 R6 #0\n", outStream); 	// push return value on top of stack
	}
	else if(strcmp(token, "le") == 0) {
		fputs("\tLDR R0 R6 #0\n", outStream);	// get a
		fputs("\tLDR R1 R6 #1\n", outStream); 	// get b
		fputs("\tADD R6 R6 #1\n", outStream); 	// update SP
		fputs("\tCMP R0 R1\n", outStream); 	// a - b
		fprintf(outStream, "\tBRnz %s_comp_%d\n", fileName, comp_index);		// if negative or 0, skip next 2 lines
		fputs("\tCONST R0 #0\n", outStream);	// false, so want to return 0
		fprintf(outStream, "\tBRnzp %s_comp_%d\n", fileName, comp_index + 1);		// skip next line
		fprintf(outStream, "%s_comp_%d", fileName, comp_index);
		fputs("\tCONST R0 #1\n", outStream);	// true, so want to return 1
		fprintf(outStream, "%s_comp_%d\n", fileName, comp_index + 1);
		comp_index++;
		fputs("\tSTR R0 R6 #0\n", outStream); 	// push return value on top of stack
	}
	else if(strcmp(token, "eq") == 0) {
		fputs("\tLDR R0 R6 #0\n", outStream);	// get a
		fputs("\tLDR R1 R6 #1\n", outStream); 	// get b
		fputs("\tADD R6 R6 #1\n", outStream); 	// update SP
		fputs("\tCMP R0 R1\n", outStream); 	// a - b
		fprintf(outStream, "\tBRz %s_comp_%d\n", fileName, comp_index);		// if negative or 0, skip next 2 lines
		fputs("\tCONST R0 #0\n", outStream);	// false, so want to return 0
		fprintf(outStream, "\tBRnzp %s_comp_%d\n", fileName, comp_index + 1);		// skip next line
		fprintf(outStream, "%s_comp_%d", fileName, comp_index);
		fputs("\tCONST R0 #1\n", outStream);	// true, so want to return 1
		fprintf(outStream, "%s_comp_%d\n", fileName, comp_index + 1);
		comp_index++;
		fputs("\tSTR R0 R6 #0\n", outStream); 	// push return value on top of stack
	}
	else if(strcmp(token, "gt") == 0) {
		fputs("\tLDR R0 R6 #0\n", outStream);	// get a
		fputs("\tLDR R1 R6 #1\n", outStream); 	// get b
		fputs("\tADD R6 R6 #1\n", outStream); 	// update SP
		fputs("\tCMP R0 R1\n", outStream); 	// a - b
		fprintf(outStream, "\tBRp %s_comp_%d\n", fileName, comp_index);		// if negative or 0, skip next 2 lines
		fputs("\tCONST R0 #0\n", outStream);	// false, so want to return 0
		fprintf(outStream, "\tBRnzp %s_comp_%d\n", fileName, comp_index + 1);		// skip next line
		fprintf(outStream, "%s_comp_%d", fileName, comp_index);
		fputs("\tCONST R0 #1\n", outStream);	// true, so want to return 1
		fprintf(outStream, "%s_comp_%d\n", fileName, comp_index + 1);
		comp_index++;
		fputs("\tSTR R0 R6 #0\n", outStream); 	// push return value on top of stack
	}
	else if(strcmp(token, "ge") == 0) {
		fputs("\tLDR R0 R6 #0\n", outStream);	// get a
		fputs("\tLDR R1 R6 #1\n", outStream); 	// get b
		fputs("\tADD R6 R6 #1\n", outStream); 	// update SP
		fputs("\tCMP R0 R1\n", outStream); 	// a - b
		fprintf(outStream, "\tBRzp %s_comp_%d\n", fileName, comp_index);		// if negative or 0, skip next 2 lines
		fputs("\tCONST R0 #0\n", outStream);	// false, so want to return 0
		fprintf(outStream, "\tBRnzp %s_comp_%d\n", fileName, comp_index + 1);		// skip next line
		fprintf(outStream, "%s_comp_%d", fileName, comp_index);
		fputs("\tCONST R0 #1\n", outStream);	// true, so want to return 1
		fprintf(outStream, "%s_comp_%d\n", fileName, comp_index + 1);
		comp_index++;
		fputs("\tSTR R0 R6 #0\n", outStream); 	// push return value on top of stack
	}
	else if(strcmp(token, "and") == 0) {
		fputs("\tLDR R0 R6 #0\n", outStream);	// get top two values from stack
		fputs("\tLDR R1 R6 #1\n", outStream);
		fputs("\tAND R0 R0 R1\n", outStream);	// bitwise and them
		fputs("\tADD R6 R6 #1\n", outStream);	// update SP
		fputs("\tSTR R0 R6 #0\n", outStream); 	// push return value on top of stack
	}
	else if(strcmp(token, "or") == 0) {
		fputs("\tLDR R0 R6 #0\n", outStream);	// get top two values from stack
		fputs("\tLDR R1 R6 #1\n", outStream);
		fputs("\tOR R0 R0 R1\n", outStream);	// bitwise or them
		fputs("\tADD R6 R6 #1\n", outStream);	// update SP
		fputs("\tSTR R0 R6 #0\n", outStream); 	// push return value on top of stack
	}
	else if(strcmp(token, "not") == 0) {
		fputs("\tLDR R0 R6 #0\n", outStream);	// get top value from stack
		fputs("\tNOT R0 R0\n", outStream);		// bitwise not 
		fputs("\tSTR R0 R6 #0\n", outStream); 	// push return value on top of stack
	}
	else if(strcmp(token, "drop") == 0) {
		fputs("\tADD R6 R6 #1\n", outStream);
	}
	else if(strcmp(token, "dup") == 0) {
		fputs("\tLDR R0 R6 #0\n", outStream); 	// get value at top of stack
		fputs("\tADD R6 R6 #-1\n", outStream);	// update SP
		fputs("\tSTR R0 R6 #0\n", outStream);	// push value to new stack top
	}
	else if(strcmp(token, "swap") == 0) {
		fputs("\tLDR R0 R6 #0\n", outStream);	// load top two values
		fputs("\tLDR R1 R6 #1\n", outStream);
		fputs("\tSTR R1 R6 #0\n", outStream);	// swap and push back to stack
		fputs("\tSTR R0 R6 #1\n", outStream);
	}
	else if(strcmp(token, "rot") == 0) {
		fputs("\tLDR R0 R6 #0\n", outStream);	// load top three values
		fputs("\tLDR R1 R6 #1\n", outStream);
		fputs("\tLDR R2 R6 #2\n", outStream);
		fputs("\tSTR R0 R6 #1\n", outStream);	// rotate them and push back to stack
		fputs("\tSTR R1 R6 #2\n", outStream);
		fputs("\tSTR R2 R6 #0\n", outStream);
	}
	else if(strcmp(token, "pick") == 0) {
		fputs("\tLDR R0 R6 #0\n", outStream); 	// pop index val off top of stack
		fputs("\tADD R6 R6 #1\n", outStream);	// update SP
		fputs("\tADD R0 R0 R6\n", outStream);	// offset R6 by index value in R0
		fputs("\tLDR R0 R0 #0\n", outStream);	// load value at offset value
		fputs("\tADD R6 R6 #-1\n", outStream); // update SP 
		fputs("\tSTR R0 R6 #0\n", outStream);	// push return value to stack top
	}
	else if(strcmp(token, "if") == 0) {
		ind+=2;
		starting_index = ind;
		fputs("\tLDR R0 R6 #0\n", outStream);	// pop value off top of stack
		fputs("\tADD R6 R6 #1\n", outStream); 	// update SP
		fputs("\tCMPI R0 #0\n", outStream);	// check if top of stack was true
		fprintf(outStream, "\tBRz %s_%d\n", fileName, ind);	// if false, break to assigned label
		while(!endif) {
			readToken(inStream, token);
			if(strcmp(token, "if") == 0) {
				handleToken(inStream, outStream, token);
			}
			else if(strcmp(token, "else") == 0) {
				fprintf(outStream, "\tBRnzp %s_%d\n", fileName, starting_index + 1);
				fprintf(outStream, "%s_%d\n", fileName, starting_index);
				hasElse = 1;
			}
			else if(strcmp(token, "endif") == 0) {
				fprintf(outStream, "%s_%d\n", fileName, starting_index + hasElse);
				endif = 1;
			}
			else {
				handleToken(inStream, outStream, token);
			}
		}
	}
	else if(strcmp(token, "defun") == 0) {
		readToken(inStream, name);
		if(!isAlnumString(name)) {
			printf("Error: %s is not a valid function name. All characters in a function name must be alphanumeric.\n", name);
			exit(1);
		}
		fputs("\t.CODE\n", outStream);
		fputs("\t.FALIGN\n", outStream);
		//writes name of function to file
		fprintf(outStream, "%s\n", name);
		//prologue
		fputs("\tADD R6 R6 #-3\n", outStream);	// allocate 3 slots for FP, RA, RV
		fputs("\tSTR R7 R6 #1\n", outStream);	// save RA that was stored in R7
		fputs("\tSTR R5 R6 #0\n", outStream); 	// save caller FP that is the value of R5
		fputs("\tADD R5 R6 #0\n", outStream);	// set up local FP to begin at current stack top
	}
	else if(strcmp(token, "return") == 0) {
		//epilogue
		fputs("\tLDR R0 R6 #0\n", outStream); 	// load value from top of stack
		fputs("\tSTR R0 R5 #2\n", outStream);	// put this value into RV address
		fputs("\tADD R6 R5 #0\n", outStream);	// move top of stack back to local frame
		fputs("\tLDR R5 R6 #0\n", outStream);	// restore caller FP
		fputs("\tLDR R7 R6 #1\n", outStream);	// restore RA
		fputs("\tADD R6 R6 #2\n", outStream); 	// free RA, FP; top of stack is RV
		fputs("\tRET\n", outStream);			// return
	}
	else if(isDecimalString(token)) {
		fprintf(outStream, "\tCONST R0 #%s\n", token);
		fputs("\tSTR R0 R6 #-1\n", outStream);
		fputs("\tADD R6 R6 #-1\n", outStream);
	}
	else if(isHexString(token)) {
		fprintf(outStream, "\tCONST R0 %s\n", token);
		fputs("\tSTR R0 R6 #-1\n", outStream);
		fputs("\tADD R6 R6 #-1\n", outStream);
	}
	else if(isAlnumString(token)) {
		fprintf(outStream, "\tJSR %s\n", token); 	// Jump to function name
	}
	else {
		printf("Error: %s is not a valid token in J.\n", token);
		exit(1);
	}
	printf("%s\n", token);
}
Пример #8
0
char OSISXHTMLXS::processText(SWBuf &text, const SWKey *key, const SWModule *module) {
	char *from;
	char token[4096];
	int tokpos = 0;
	bool intoken = false;
	bool inEsc = false;
	SWBuf lastTextNode;
	MyUserDataXS *userData = (MyUserDataXS *)createUserData(module, key);
	

	SWBuf orig = text;
	from = orig.getRawData();
	text = "";

	for (;*from; from++) {

		if (*from == '<') {
			intoken = true;
			tokpos = 0;
			token[0] = 0;
			token[1] = 0;
			token[2] = 0;
			inEsc = false;
			continue;
		}

		if (*from == '&') {
			intoken = true;
			tokpos = 0;
			token[0] = 0;
			token[1] = 0;
			token[2] = 0;
			inEsc = true;
			continue;
		}

		if (inEsc) {
			if (*from == ';') {
				intoken = inEsc = false;
				userData->lastTextNode = lastTextNode;
				
				if (!userData->suspendTextPassThru)  { //if text through is disabled no tokens should pass, too
					handleEscapeString(text, token, userData);
				}
				lastTextNode = "";
				continue;
			}
		}

		if (!inEsc) {
			if (*from == '>') {
				intoken = false;
				userData->lastTextNode = lastTextNode;
				handleToken(text, token, userData);
				lastTextNode = "";
				continue;
			}
		}

		if (intoken) {
			if (tokpos < 4090) {
				token[tokpos++] = *from;
				token[tokpos+2] = 0;
			}
		}
		else {
 			if ((!userData->supressAdjacentWhitespace) || (*from != ' ')) {
				if (!userData->suspendTextPassThru) {
					text.append(*from);
					userData->lastSuspendSegment.size(0);
				}
				else	userData->lastSuspendSegment.append(*from);
				lastTextNode.append(*from);
 			}
			userData->supressAdjacentWhitespace = false;
		}

	}
	
	// THE MAIN PURPOSE OF THIS OVERRIDE FUNCTION: is to insure all opened HTML tags are closed
	while (!userData->htmlTagStack->empty()) {
		text.append((SWBuf)"</" + userData->htmlTagStack->top().c_str() + ">");
		userData->htmlTagStack->pop();
	}

	delete userData;
	return 0;
}
Пример #9
0
char SWBasicFilter::processText(std::string &text, const SWKey *key, const SWModule *module) {
    char *from;
    char token[4096];
    int tokpos = 0;
    bool intoken = false;
    bool inEsc = false;
    int escStartPos = 0, escEndPos = 0;
    int tokenStartPos = 0, tokenEndPos = 0;
    std::string lastTextNode;
    BasicFilterUserData *userData = createUserData(module, key);

    std::string orig = text;
    from = &orig[0u];
    text = "";

    if (processStages & INITIALIZE) {
        if (processStage(INITIALIZE, text, from, userData)) {    // processStage handled it all
            delete userData;
            return 0;
        }
    }

    for (;*from; from++) {

        if (processStages & PRECHAR) {
            if (processStage(PRECHAR, text, from, userData))    // processStage handled this char
                continue;
        }

        if (*from == tokenStart[tokenStartPos]) {
            if (tokenStartPos == (tokenStartLen - 1)) {
                intoken = true;
                tokpos = 0;
                token[0] = 0;
                token[1] = 0;
                token[2] = 0;
                inEsc = false;
            }
            else tokenStartPos++;
            continue;
        }

        if (*from == escStart[escStartPos]) {
            if (escStartPos == (escStartLen - 1)) {
                intoken = true;
                tokpos = 0;
                token[0] = 0;
                token[1] = 0;
                token[2] = 0;
                inEsc = true;
            }
            else escStartPos++;
            continue;
        }

        if (inEsc) {
            if (*from == escEnd[escEndPos]) {
                if (escEndPos == (escEndLen - 1)) {
                    intoken = inEsc = false;
                    userData->lastTextNode = lastTextNode;

                    if (!userData->suspendTextPassThru)  { //if text through is disabled no tokens should pass, too
                        if ((!handleEscapeString(text, token, userData)) && (passThruUnknownEsc)) {
                            appendEscapeString(text, token);
                        }
                    }
                    escEndPos = escStartPos = tokenEndPos = tokenStartPos = 0;
                    lastTextNode = "";
                    continue;
                }
            }
        }

        if (!inEsc) {
            if (*from == tokenEnd[tokenEndPos]) {
                if (tokenEndPos == (tokenEndLen - 1)) {
                    intoken = false;
                    userData->lastTextNode = lastTextNode;
                    if ((!handleToken(text, token, userData)) && (passThruUnknownToken)) {
                        text += tokenStart;
                        text += token;
                        text += tokenEnd;
                    }
                    escEndPos = escStartPos = tokenEndPos = tokenStartPos = 0;
                    lastTextNode = "";
                    continue;
                }
            }
        }

        if (intoken) {
            if (tokpos < 4090) {
                token[tokpos++] = *from;
                token[tokpos+2] = 0;
            }
        }
        else {
             if ((!userData->supressAdjacentWhitespace) || (*from != ' ')) {
                if (!userData->suspendTextPassThru) {
                    text.push_back(*from);
                    userData->lastSuspendSegment.clear();
                }
                else    userData->lastSuspendSegment.push_back(*from);
                lastTextNode.push_back(*from);
             }
            userData->supressAdjacentWhitespace = false;
        }

        if (processStages & POSTCHAR)
            processStage(POSTCHAR, text, from, userData);

    }

    if (processStages & FINALIZE)
        processStage(FINALIZE, text, from, userData);

    delete userData;
    return 0;
}
Пример #10
0
Ast::Block* Parser::run()
{
    current = ts.begin();
    while(handleToken() && current != ts.end());
    return program;
}
Пример #11
0
void PcreParser::handleToken(RegexpToken token)
{
    QRegExp rx;
    QRegExp characterClass;
    QRegExp bracketExpressionLiteral("[^\\\\[\\]\\.]|\\\\[^a-zA-Z0-9]");
    QRegExp bracketExpressionRange(_syntax[T_BRACKET_EXPRESSION_RANGE]);
    QRegExp flagClose;
    Token *openingToken;
    QString character;
    QString tmp;

    switch(token)
    {
    case T_LITERAL:
    case T_ALTERNATION:
    case T_ANY_CHARACTER:
    case T_STARTING_POSITION:
    case T_ENDING_POSITION:
    case T_BACKREFERENCE:
    case T_WORD:
    case T_NOT_WORD:
    case T_DIGIT:
    case T_NOT_DIGIT:
    case T_SPACE:
    case T_NOT_SPACE:
    case T_WORD_BOUNDARY:
    case T_NOT_WORD_BOUNDARY:
    case T_OCTAL_CHAR:
    case T_NAMED_BACKREFERENCE:
    case T_FIRST_MATCHING_POSITION:
    case T_START_OF_STRING:
    case T_END_OF_STRING:
    case T_END_OF_STRING_WITH_CLOSING_EOL:
    case T_ALNUM:
    case T_ALPHA:
    case T_BLANK:
    case T_CNTRL:
    case T_GRAPH:
    case T_LOWER:
    case T_PRINT:
    case T_PUNCT:
    case T_UPPER:
    case T_XDIGIT:
    case T_HORIZONTAL_WHITESPACE:
    case T_NOT_HORIZONTAL_WHITESPACE:
    case T_VERTICAL_WHITESPACE:
    case T_NOT_VERTICAL_WHITESPACE:
    case T_BELL:
    case T_BACKSPACE:
    case T_ESCAPE:
    case T_FORM_FEED:
    case T_LINE_FEED:
    case T_HORIZONTAL_TAB:
    case T_HEXADECIMAL_CHAR:
        _tokens.push_back(new Token(token, _expression.mid(_pos, _matchLength)));
        _pos += _matchLength;
        break;
    case T_GROUPING_OPEN:
    case T_REVERSED_CAPTURING_GROUPING_OPEN:
    case T_NAMED_GROUPING_OPEN:
        openingToken = new Token(token, _expression.mid(_pos, _matchLength));
        _tokens.push_back(openingToken);
        _pos += _matchLength;

        rx.setPattern(_syntax[T_GROUPING_CLOSE]);

        while(rx.indexIn(_expression, _pos) != _pos && _pos < _expression.length())
            handleToken(findMatch());

        if(rx.indexIn(_expression, _pos) == _pos)
        {
            _tokens.push_back(new Token(T_GROUPING_CLOSE, _expression.mid(_pos, 1)));
            _pos += 1;
        }
        else
            openingToken->setType(T_ERROR);
        break;
    case T_BRACKET_EXPRESSION_OPEN:
    case T_NEGATED_BRACKET_EXPRESSION_OPEN:
        openingToken = new Token(token, _expression.mid(_pos, _matchLength));
        _tokens.push_back(openingToken);
        _pos += _matchLength;

        rx.setPattern(_syntax[T_BRACKET_EXPRESSION_CLOSE]);
        // Look for a "[]...]" or "[^]...]" including a literal close bracket in
        // the first position of the bracket expression
        if(rx.indexIn(_expression, _pos) == _pos)
        {
            _tokens.push_back(new Token(T_LITERAL, _expression.mid(_pos, rx.matchedLength())));
            _pos += rx.matchedLength();
        }

        while(rx.indexIn(_expression, _pos) != _pos && _pos < _expression.length())
        {
            bool matched = false;
            if(matched == false && bracketExpressionRange.indexIn(_expression, _pos) == _pos)
            {
                matched = true;
                _tokens.push_back(new Token(T_BRACKET_EXPRESSION_RANGE, _expression.mid(_pos, bracketExpressionRange.matchedLength())));
                _pos += bracketExpressionRange.matchedLength();
            }

            if(matched == false && bracketExpressionLiteral.indexIn(_expression, _pos) == _pos)
            {
                matched = true;
                _tokens.push_back(new Token(T_LITERAL, _expression.mid(_pos, bracketExpressionLiteral.matchedLength())));
                _pos += bracketExpressionLiteral.matchedLength();
            }

            characterClass.setPattern(_syntax[T_WORD]);
            if(matched == false && characterClass.indexIn(_expression, _pos) == _pos)
            {
                matched = true;
                _tokens.push_back(new Token(T_WORD, _expression.mid(_pos, characterClass.matchedLength())));
                _pos += characterClass.matchedLength();
            }

            characterClass.setPattern(_syntax[T_NOT_WORD]);
            if(matched == false && characterClass.indexIn(_expression, _pos) == _pos)
            {
                matched = true;
                _tokens.push_back(new Token(T_NOT_WORD, _expression.mid(_pos, characterClass.matchedLength())));
                _pos += characterClass.matchedLength();
            }

            characterClass.setPattern(_syntax[T_DIGIT]);
            if(matched == false && characterClass.indexIn(_expression, _pos) == _pos)
            {
                matched = true;
                _tokens.push_back(new Token(T_DIGIT, _expression.mid(_pos, characterClass.matchedLength())));
                _pos += characterClass.matchedLength();
            }

            characterClass.setPattern(_syntax[T_NOT_DIGIT]);
            if(matched == false && characterClass.indexIn(_expression, _pos) == _pos)
            {
                matched = true;
                _tokens.push_back(new Token(T_NOT_DIGIT, _expression.mid(_pos, characterClass.matchedLength())));
                _pos += characterClass.matchedLength();
            }

            characterClass.setPattern(_syntax[T_SPACE]);
            if(matched == false && characterClass.indexIn(_expression, _pos) == _pos)
            {
                matched = true;
                _tokens.push_back(new Token(T_SPACE, _expression.mid(_pos, characterClass.matchedLength())));
                _pos += characterClass.matchedLength();
            }

            characterClass.setPattern(_syntax[T_NOT_SPACE]);
            if(matched == false && characterClass.indexIn(_expression, _pos) == _pos)
            {
                matched = true;
                _tokens.push_back(new Token(T_NOT_SPACE, _expression.mid(_pos, characterClass.matchedLength())));
                _pos += characterClass.matchedLength();
            }

            characterClass.setPattern(_syntax[T_WORD_BOUNDARY]);
            if(matched == false && characterClass.indexIn(_expression, _pos) == _pos)
            {
                matched = true;
                _tokens.push_back(new Token(T_WORD_BOUNDARY, _expression.mid(_pos, characterClass.matchedLength())));
                _pos += characterClass.matchedLength();
            }

            characterClass.setPattern(_syntax[T_NOT_WORD_BOUNDARY]);
            if(matched == false && characterClass.indexIn(_expression, _pos) == _pos)
            {
                matched = true;
                _tokens.push_back(new Token(T_NOT_WORD_BOUNDARY, _expression.mid(_pos, characterClass.matchedLength())));
                _pos += characterClass.matchedLength();
            }

            characterClass.setPattern(_syntax[T_BELL]);
            if(matched == false && characterClass.indexIn(_expression, _pos) == _pos)
            {
                matched = true;
                _tokens.push_back(new Token(T_BELL, _expression.mid(_pos, characterClass.matchedLength())));
                _pos += characterClass.matchedLength();
            }

            characterClass.setPattern(_syntax[T_ESCAPE]);
            if(matched == false && characterClass.indexIn(_expression, _pos) == _pos)
            {
                matched = true;
                _tokens.push_back(new Token(T_ESCAPE, _expression.mid(_pos, characterClass.matchedLength())));
                _pos += characterClass.matchedLength();
            }

            characterClass.setPattern(_syntax[T_FORM_FEED]);
            if(matched == false && characterClass.indexIn(_expression, _pos) == _pos)
            {
                matched = true;
                _tokens.push_back(new Token(T_FORM_FEED, _expression.mid(_pos, characterClass.matchedLength())));
                _pos += characterClass.matchedLength();
            }

            characterClass.setPattern(_syntax[T_LINE_FEED]);
            if(matched == false && characterClass.indexIn(_expression, _pos) == _pos)
            {
                matched = true;
                _tokens.push_back(new Token(T_LINE_FEED, _expression.mid(_pos, characterClass.matchedLength())));
                _pos += characterClass.matchedLength();
            }

            characterClass.setPattern(_syntax[T_HORIZONTAL_TAB]);
            if(matched == false && characterClass.indexIn(_expression, _pos) == _pos)
            {
                matched = true;
                _tokens.push_back(new Token(T_HORIZONTAL_TAB, _expression.mid(_pos, characterClass.matchedLength())));
                _pos += characterClass.matchedLength();
            }

            characterClass.setPattern(_syntax[T_OCTAL_CHAR]);
            if(matched == false && characterClass.indexIn(_expression, _pos) == _pos)
            {
                matched = true;
                _tokens.push_back(new Token(T_OCTAL_CHAR, _expression.mid(_pos, characterClass.matchedLength())));
                _pos += characterClass.matchedLength();
            }

            if(!matched)
            {
                _tokens.push_back(new Token(T_ERROR, _expression.mid(_pos, 1)));
                ++_pos;
            }
        }

        if(rx.indexIn(_expression, _pos) == _pos)
        {
            _tokens.push_back(new Token(T_BRACKET_EXPRESSION_CLOSE,
                                        _expression.mid(_pos, rx.matchedLength()))
                              );
            _pos += rx.matchedLength();
        }
        else
            openingToken->setType(T_ERROR);

        break;
    case T_POSITIVE_LOOKAHEAD_ASSERTION_OPEN:
    case T_NEGATIVE_LOOKAHEAD_ASSERTION_OPEN:
    case T_POSITIVE_LOOKBEHIND_ASSERTION_OPEN:
    case T_NEGATIVE_LOOKBEHIND_ASSERTION_OPEN:
        openingToken = new Token(token, _expression.mid(_pos, _matchLength));
        _tokens.push_back(openingToken);
        _pos += _matchLength;

        rx.setPattern(_syntax[T_ASSERTION_CLOSE]);
        while(rx.indexIn(_expression, _pos) != _pos && _pos < _expression.length())
            handleToken(findMatch());

        if(rx.indexIn(_expression, _pos) == _pos)
        {
            _tokens.push_back(new Token(T_ASSERTION_CLOSE, _expression.mid(_pos, 1)));
            _pos += 1;
        }
        else
            openingToken->setType(T_ERROR);
        break;
    case T_REPEAT_ZERO_OR_ONE:
    case T_REPEAT_ANY_NUMBER:
    case T_REPEAT_ONE_OR_MORE:
    case T_REPEAT_SPECIFIED:
    case T_REPEAT_ZERO_OR_ONE_NONGREEDY:
    case T_REPEAT_ANY_NUMBER_NONGREEDY:
    case T_REPEAT_ONE_OR_MORE_NONGREEDY:
    case T_REPEAT_SPECIFIED_NONGREEDY:
    case T_REPEAT_ZERO_OR_ONE_POSSESSIVE:
    case T_REPEAT_ANY_NUMBER_POSSESSIVE:
    case T_REPEAT_ONE_OR_MORE_POSSESSIVE:
    case T_REPEAT_SPECIFIED_POSSESSIVE:
        switch(_tokens[_tokens.size()-1]->type())
        {
        case T_POSITIVE_LOOKAHEAD_ASSERTION_OPEN:
        case T_NEGATIVE_LOOKAHEAD_ASSERTION_OPEN:
        case T_POSITIVE_LOOKBEHIND_ASSERTION_OPEN:
        case T_NEGATIVE_LOOKBEHIND_ASSERTION_OPEN:
        case T_REPEAT_ZERO_OR_ONE:
        case T_REPEAT_ANY_NUMBER:
        case T_REPEAT_ONE_OR_MORE:
        case T_REPEAT_SPECIFIED:
        case T_REPEAT_ZERO_OR_ONE_NONGREEDY:
        case T_REPEAT_ANY_NUMBER_NONGREEDY:
        case T_REPEAT_ONE_OR_MORE_NONGREEDY:
        case T_REPEAT_SPECIFIED_NONGREEDY:
        case T_REPEAT_ZERO_OR_ONE_POSSESSIVE:
        case T_REPEAT_ANY_NUMBER_POSSESSIVE:
        case T_REPEAT_ONE_OR_MORE_POSSESSIVE:
        case T_REPEAT_SPECIFIED_POSSESSIVE:
        case T_GROUPING_OPEN:
        case T_REVERSED_CAPTURING_GROUPING_OPEN:
        case T_NAMED_GROUPING_OPEN:
            _tokens.push_back(new Token(T_ERROR, _expression.mid(_pos, _matchLength)));
            _pos += _matchLength;
            break;
        case T_LITERAL:
            // Requires a bit of extra work to separate the last character from
            // the literal
            character = _tokens[_tokens.size()-1]->value().right(1);
            tmp = _tokens[_tokens.size()-1]->value();
            if(tmp.size() > 1)
            {
                tmp.truncate(tmp.length() - 1);
                _tokens[_tokens.size()-1]->setValue(tmp);
                _tokens.push_back(new Token(T_LITERAL, character));
            }
        default:
            _tokens.push_back(new Token(token, _expression.mid(_pos, _matchLength)));
            _pos += _matchLength;
        }
        break;
    case T_COMMENT_OPEN:
        openingToken = new Token(token, _expression.mid(_pos, _matchLength));
        _tokens.push_back(openingToken);
        _pos += _matchLength;

        // Comments contain one literal comment message lasting up until the
        // next closing paren
        rx.setMinimal(true);
        rx.setPattern(QString(".*(?=") + _syntax[T_COMMENT_CLOSE] + ")");
        if(rx.indexIn(_expression, _pos) == _pos)
        {
            _tokens.push_back(new Token(T_LITERAL, _expression.mid(_pos, rx.matchedLength())));
            _pos += rx.matchedLength();
        }

        rx.setPattern(_syntax[T_COMMENT_CLOSE]);
        if(rx.indexIn(_expression, _pos) != _pos)
            openingToken->setType(T_ERROR);
        else
        {
            _tokens.push_back(new Token(T_COMMENT_CLOSE, _expression.mid(_pos, rx.matchedLength())));
            _pos += rx.matchedLength();
        }
        break;
    case T_QUOTE_SEQUENCE_OPEN:
        openingToken = new Token(token, _expression.mid(_pos, _matchLength));
        _tokens.push_back(openingToken);
        _pos += _matchLength;

        // Quote sequences are literal up until a closing \E
        rx.setMinimal(true);
        rx.setPattern(QString(".*(?=") + _syntax[T_QUOTE_SEQUENCE_CLOSE] + ")");
        if(rx.indexIn(_expression, _pos) == _pos)
        {
            _tokens.push_back(new Token(T_LITERAL, _expression.mid(_pos, rx.matchedLength())));
            _pos += rx.matchedLength();
        }

        rx.setPattern(_syntax[T_QUOTE_SEQUENCE_CLOSE]);
        if(rx.indexIn(_expression, _pos) != _pos)
            openingToken->setType(T_ERROR);
        else
        {
            _tokens.push_back(new Token(T_QUOTE_SEQUENCE_CLOSE, _expression.mid(_pos, rx.matchedLength())));
            _pos += rx.matchedLength();
        }
        break;
    case T_FLAGS_OPEN:
        openingToken = new Token(token, _expression.mid(_pos, _matchLength));
        _tokens.push_back(openingToken);
        _pos += _matchLength;

        // Flag sections can contain a-zA-Z- characters and end with a close
        // paren, if we encounter anything else then we'll stop trying to match
        // it as a flag and mark the opening as an error
        rx.setMinimal(true);
        rx.setPattern(QString("[a-zA-Z-]*") + _syntax[T_FLAGS_CLOSE]);
        if(rx.indexIn(_expression, _pos) != _pos)
            openingToken->setType(T_ERROR);
        else
        {
            flagClose.setPattern(_syntax[T_FLAGS_CLOSE]);
            while(flagClose.indexIn(_expression, _pos) != _pos)
            {
                bool matched = false;

                rx.setPattern(_syntax[T_FLAGS_NEGATION]);
                if(!matched && rx.indexIn(_expression, _pos) == _pos)
                {
                    _tokens.push_back(new Token(T_FLAGS_NEGATION, _expression.mid(_pos, rx.matchedLength())));
                    _pos += rx.matchedLength();
                    matched = true;
                }

                rx.setPattern(_syntax[T_FLAG_CASELESS]);
                if(!matched && rx.indexIn(_expression, _pos) == _pos)
                {
                    _tokens.push_back(new Token(T_FLAG_CASELESS, _expression.mid(_pos, rx.matchedLength())));
                    _pos += rx.matchedLength();
                    matched = true;
                }

                rx.setPattern(_syntax[T_FLAG_DOTALL]);
                if(!matched && rx.indexIn(_expression, _pos) == _pos)
                {
                    _tokens.push_back(new Token(T_FLAG_DOTALL, _expression.mid(_pos, rx.matchedLength())));
                    _pos += rx.matchedLength();
                    matched = true;
                }

                rx.setPattern(_syntax[T_FLAG_MULTILINE]);
                if(!matched && rx.indexIn(_expression, _pos) == _pos)
                {
                    _tokens.push_back(new Token(T_FLAG_MULTILINE, _expression.mid(_pos, rx.matchedLength())));
                    _pos += rx.matchedLength();
                    matched = true;
                }

                rx.setPattern(_syntax[T_FLAG_EXTENDED]);
                if(!matched && rx.indexIn(_expression, _pos) == _pos)
                {
                    _tokens.push_back(new Token(T_FLAG_EXTENDED, _expression.mid(_pos, rx.matchedLength())));
                    _pos += rx.matchedLength();
                    matched = true;
                }

                rx.setPattern(_syntax[T_FLAG_PCRE_EXTRA]);
                if(!matched && rx.indexIn(_expression, _pos) == _pos)
                {
                    _tokens.push_back(new Token(T_FLAG_PCRE_EXTRA, _expression.mid(_pos, rx.matchedLength())));
                    _pos += rx.matchedLength();
                    matched = true;
                }

                rx.setPattern(_syntax[T_FLAG_ANCHORED]);
                if(!matched && rx.indexIn(_expression, _pos) == _pos)
                {
                    _tokens.push_back(new Token(T_FLAG_ANCHORED, _expression.mid(_pos, rx.matchedLength())));
                    _pos += rx.matchedLength();
                    matched = true;
                }

                rx.setPattern(_syntax[T_FLAG_UNGREEDY]);
                if(!matched && rx.indexIn(_expression, _pos) == _pos)
                {
                    _tokens.push_back(new Token(T_FLAG_UNGREEDY, _expression.mid(_pos, rx.matchedLength())));
                    _pos += rx.matchedLength();
                    matched = true;
                }

                if(!matched)
                {
                    _tokens.push_back(new Token(T_ERROR, _expression.mid(_pos, 1)));
                    ++_pos;
                }
            }

            _tokens.push_back(new Token(T_FLAGS_CLOSE, _expression.mid(_pos, flagClose.matchedLength())));
            _pos += flagClose.matchedLength();
        }
        break;
    default:
        qDebug() << "Unknown token at position " << _pos << ": " << token;
        qDebug() << "Value: " << _expression.mid(_pos, _matchLength);
        _tokens.push_back(new Token(T_ERROR, _expression.mid(_pos, _matchLength)));
        _pos += _matchLength;
    }
}