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/commandTable.cpp

257 lines
5.2 KiB

/*
valid Commands for Input/Output
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 "commandTable.h"
#include <iostream>
using namespace std;
CommandTable::CommandTable(){
nCommandDesc=0;
}
CommandTable::~CommandTable(){
}
const char* CommandTable::getCommand(int nr) {
int i;
const char* back="";
for(i=0;i<nCommandDesc;i++) {
if (commandDesc[i].number == nr) {
return commandDesc[i].longName;
}
}
return back;
}
const char* CommandTable::getCommand(const char* name) {
int i;
int comp;
unsigned int nlen;
const char* back="";
for(i=0;i<nCommandDesc;i++) {
nlen=strlen(commandDesc[i].longName);
comp=strncmp(commandDesc[i].longName,name,nlen);
if (comp == 0) {
if (strlen(name) == nlen) {
return commandDesc[i].longName;
} else if ((strlen(name) > nlen) && (name[nlen]==' ')) {
return commandDesc[i].longName;
}
}
if (strlen(commandDesc[i].shortName) > 0) {
nlen=strlen(commandDesc[i].shortName);
comp=strncmp(commandDesc[i].shortName,name,nlen);
if (comp == 0) {
if (strlen(name) == nlen) {
return commandDesc[i].shortName;
} else if ((strlen(name) > nlen) && (name[nlen]==' ')) {
return commandDesc[i].shortName;
}
}
}
}
return back;
}
int CommandTable::getNr(const char* command) {
int i;
int comp;
int back=-1;
unsigned int nlen;
for(i=0;i<nCommandDesc;i++) {
nlen=strlen(commandDesc[i].longName);
comp=strncmp(commandDesc[i].longName,command,nlen);
if (comp == 0) {
if (strlen(command) == nlen) {
return commandDesc[i].number;
} else if ((strlen(command) > nlen) && (command[nlen]==' ')) {
return commandDesc[i].number;
}
}
if (strlen(commandDesc[i].shortName) > 0) {
nlen=strlen(commandDesc[i].shortName);
comp=strncmp(commandDesc[i].shortName,command,nlen);
if (comp == 0) {
if (strlen(command) == nlen) {
return commandDesc[i].number;
} else if((strlen(command) > nlen) && (command[nlen]==' ')){
return commandDesc[i].number;
}
}
}
}
return back;
}
const char* CommandTable::getArgs(const char* command,const char* wholeLine) {
unsigned int i;
unsigned int n;
const char* back;
back=wholeLine;
n=strlen(command);
if (n==0) return back;
for(i=0;i<n;i++) {
back++;
}
// we must take care that after every command there may be a
// space
if (strlen(wholeLine) > n) {
back++;
}
return back;
}
void CommandTable::print() {
int i;
cout << "internal Help System V. 0.2\n";
cout << "known commands are :\n\n";
for(i=0;i<nCommandDesc;i++) {
print(commandDesc[i].number,false);
}
}
int CommandTable::getPos(int commandNr) {
int i;
int pos=-1;
for (i=0;i<nCommandDesc;i++) {
if (commandDesc[i].number == commandNr) {
pos=i;
break;
}
}
return pos;
}
void CommandTable::print (int command,int lWithHelp) {
int i=getPos(command);
if (i<0) {
cout << "unknown Command\n";
return;
}
if (commandDesc[i].lexternalUse == false) return;
cout << commandDesc[i].longName << "(" ;
if (strlen(commandDesc[i].shortName) == 0) {
cout << "No";
} else {
cout << commandDesc[i].shortName;
}
cout << ") Nr :" << commandDesc[i].number <<" ";
if (lWithHelp==true) {
cout << commandDesc[i].help ;
}
cout <<"\n";
}
CommandDescription* CommandTable::getCommandDescription(int i) {
return &(commandDesc[i]);
}
int CommandTable::getCommandCounter() {
return nCommandDesc;
}
void CommandTable::join(CommandTable* table) {
int i;
int n=table->getCommandCounter();
CommandDescription* cmdDesc;
for (i=0;i<n;i++) {
cmdDesc=table->getCommandDescription(i);
insert(cmdDesc);
}
}
void CommandTable::insert(CommandDescription* cmdDesc) {
const char* lNameTest;
const char* sNameTest;
int pos=getPos(cmdDesc->number);
if (pos != -1) {
cout << "number "<< cmdDesc->number
<< " for command "<< cmdDesc->longName << " already defined!" << endl;
}
lNameTest=getCommand(cmdDesc->longName);
if (strlen(lNameTest) > 0) {
cout << "longName "<< cmdDesc->longName << " already defined."
<< "Previous definition has number : "
<< getNr(cmdDesc->longName) << endl;
}
sNameTest=getCommand(cmdDesc->shortName);
if (strlen(sNameTest) > 0) {
cout << "shortName "<< cmdDesc->shortName << " already defined."
<< "Previous definition has number : "
<< getNr(cmdDesc->shortName) << endl;
}
commandDesc[nCommandDesc].lexternalUse=cmdDesc->lexternalUse;
commandDesc[nCommandDesc].lReturn=cmdDesc->lReturn;
commandDesc[nCommandDesc].longName=cmdDesc->longName;
commandDesc[nCommandDesc].shortName=cmdDesc->shortName;
commandDesc[nCommandDesc].number=cmdDesc->number;
commandDesc[nCommandDesc].help=cmdDesc->help;
nCommandDesc++;
}
int CommandTable::getReturnFlag(int cmdNr) {
int i=getPos(cmdNr);
CommandDescription* cmdDesc;
if (i == -1) {
return -1;
}
cmdDesc=getCommandDescription(i);
return cmdDesc->lReturn;
}