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.
145 lines
3.3 KiB
145 lines
3.3 KiB
/*
|
|
Default output decoder
|
|
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 "outputDecoder.h"
|
|
#include <iostream>
|
|
|
|
using namespace std;
|
|
|
|
#define DEBUG cout << "Command:1 Msg:"
|
|
|
|
|
|
OutputDecoder::OutputDecoder() {
|
|
yafCommands=new CommandTableYAF();
|
|
yafRuntime=new RuntimeTableYAF();
|
|
|
|
appendCommandTable(yafCommands);
|
|
appendRuntimeTable(yafRuntime);
|
|
|
|
}
|
|
|
|
|
|
|
|
OutputDecoder::~OutputDecoder() {
|
|
delete yafCommands;
|
|
delete yafRuntime;
|
|
}
|
|
|
|
|
|
|
|
void OutputDecoder::appendCommandTable(CommandTable* table) {
|
|
commandTable.join(table);
|
|
}
|
|
|
|
|
|
void OutputDecoder::appendRuntimeTable(CommandTable* table) {
|
|
runtimeTable.join(table);
|
|
}
|
|
|
|
|
|
|
|
CommandTable* OutputDecoder::getCommandTable() {
|
|
return &commandTable;
|
|
}
|
|
|
|
|
|
CommandTable* OutputDecoder::getRuntimeTable() {
|
|
return &runtimeTable;
|
|
}
|
|
|
|
|
|
|
|
|
|
void OutputDecoder::processCommandLine(CommandLine* commandLine){
|
|
CommandTable* ct=&commandTable; // ct , rt are shorter..
|
|
CommandTable* rt=&runtimeTable;
|
|
|
|
|
|
int command;
|
|
int commandNr;
|
|
const char* commandStr;
|
|
const char* retString;
|
|
const char* args;
|
|
|
|
|
|
// The number of the command (unique for every command)
|
|
commandNr=atoi(commandLine->getValue(0));
|
|
|
|
// if commandNr is greater zero then we have a return command from decoder
|
|
if (commandNr >= 40) {
|
|
|
|
// the command (longName or shortName )
|
|
commandStr=ct->getCommand(commandLine->getValue(2));
|
|
// the int value of the command (faster for compare)
|
|
command=ct->getNr(commandStr);
|
|
|
|
// the Arguments of the command
|
|
args=ct->getArgs(commandStr,commandLine->getValue(2));
|
|
retString=commandLine->getValue(1);
|
|
|
|
processReturnCommand(commandNr,command,retString,args);
|
|
return;
|
|
}
|
|
|
|
// if commandNr < 40 then we have a runtime command from decoder
|
|
|
|
if (commandNr < 40) {
|
|
// the command (longName or shortName )
|
|
commandStr=rt->getCommand(commandLine->getValue(1));
|
|
// the int value of the command (faster for compare)
|
|
command=rt->getNr(commandStr);
|
|
|
|
// here I make a hack because it cannot be expected
|
|
// that during debugging every debug-info has its clean
|
|
// installed debug-identifer.
|
|
// hack:
|
|
// if the commandNr==1 (debug) and we have NO defined
|
|
// debug identifier then we do not send -1 (as in all other case)
|
|
// but the number 1 itsself.
|
|
|
|
if ((commandNr == 1) && (command == -1)) {
|
|
args=rt->getArgs(commandStr,commandLine->getValue(1));
|
|
processRuntimeCommand(1,args);
|
|
return;
|
|
}
|
|
|
|
// in *all* other cases the developer should
|
|
// implement a clean protokoll with identifiers
|
|
// (this leads to well defined interfaces :-)
|
|
|
|
// the Arguments of the command
|
|
args=rt->getArgs(commandStr,commandLine->getValue(1));
|
|
|
|
processRuntimeCommand(command,args);
|
|
return;
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
int OutputDecoder::processRuntimeCommand(int command,const char* args){
|
|
cout << command <<" * "<< args <<" * "<< endl;
|
|
return false;
|
|
}
|
|
|
|
int OutputDecoder::processReturnCommand(int cmdNr,int cmdId,
|
|
const char* ret,const char* args){
|
|
cout << cmdNr <<" * "<< cmdId<<" * "<< ret<<" * " << args << endl;
|
|
return false;
|
|
}
|
|
|
|
|
|
|
|
|