You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tdemultimedia/mpeglib/example/yaf/yafcore/parser.cpp

153 lines
3.2 KiB

/*
Checks if a valid Command Line is avaiable
Copyright (C) 1998 Martin Vogt
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU Library General Public License as published by
the Free Software Foundation.
For more information look at the file COPYRIGHT in this package
*/
#include "parser.h"
Parser::Parser() {
commandLine=new CommandLine();
parseString=new Buffer(200);
}
Parser::~Parser() {
delete commandLine;
delete parseString;
}
void Parser::setParseString(char* parseString){
(this->parseString)->setData(parseString);
// clear everything in commandline
commandLine->clear();
}
void Parser::parse() {
int commandCounter=0;
parse(parseString->getData(),&commandCounter);
commandLine->setCommandCount(commandCounter);
}
void Parser::parse(char* strStart,int* nCommand){
char* doppelPkt;
char* current;
char* space;
if (strlen(strStart) == 0) return;
doppelPkt=strchr(strStart,':');
if (doppelPkt == NULL) return;
(*doppelPkt)='\0';
commandLine->setIdentifier(*nCommand,strStart);
strStart=++doppelPkt;
current=strStart;
// Now two possibilities:
// a command with Msg : means the rest ist the value
// a command different from Msg means: further processing
if (strcmp("Msg",commandLine->getIdentifier(*nCommand)) == 0) {
commandLine->setValue((*nCommand),current);
(*nCommand)++;
return;
}
// Now two possibilities:
// a command with "Ret:" means string until the the ")" is the value
// a command different from "Ret:" means: the string until the first space
// ist the value
if (strcmp("Ret",commandLine->getIdentifier(*nCommand)) == 0) {
char* seperator;
seperator=strchr(current,')');
if (seperator == NULL) {
commandLine->setValue((*nCommand),current);
(*nCommand)++;
return;
} else {
(*seperator)='\0';
current++;
commandLine->setValue((*nCommand),current);
(*nCommand)++;
seperator++;
if (strlen(seperator) == 0) return;
parse(++seperator,&(*nCommand));
return;
}
}
space=strchr(current,' ');
if (space == NULL) {
commandLine->setValue((*nCommand),current);
(*nCommand)++;
return;
}
(*space)='\0';
commandLine->setValue((*nCommand),current);
parse(++space,&(++(*nCommand)));
}
int Parser::isOK(){
// a Commandline ist valid when it contains :
// * 2 * (identifer/value)
// * first identifier ist "Command"
// * second identifier is "Msg"
// or:
// 3 identifier
// first: "Command"
// second "Ret"
// third: "Msg"
if (commandLine->getCommandCount() == 2){
if (strcmp("Command",commandLine->getIdentifier(0)) != 0) return 0;
if (strcmp("Msg",commandLine->getIdentifier(1)) != 0) return 0;
return 1;
}
if (commandLine->getCommandCount() == 3){
if (strcmp("Command",commandLine->getIdentifier(0)) != 0) return 0;
if (strcmp("Ret",commandLine->getIdentifier(1)) != 0) return 0;
if (strcmp("Msg",commandLine->getIdentifier(2)) != 0) return 0;
return 1;
}
return 0;
}
CommandLine* Parser::getCommandLine(){
return commandLine;
}