// Set the Current variable to the current directory. void FileSystem::callDirectory(CharString location) { if(location.Compare("..",2)) { if(Current->Parent != 0x0) { Current = Current->Parent; } } else { FileStructureNode* node = getNodeFromString(location); if(node != 0x0) { if(node->type == Directory) { Current = node; } else { // throw error! CharString cs = CharString("cd: "); cs.concata(location); cs.concata(": not a directory",17); this->ErrorString = cs.get(); throw 10; } } else { // throw error! CharString cs = CharString("cd: "); cs.concata(location); cs.concata(": directory does not exist",26); this->ErrorString = cs.get(); throw 9; } } }
// Removes a directory from the current directory based on location. // Input: String location void FileSystem::removeDir(CharString location) { FileStructureNode* node = getNodeFromString(location); if(node != 0x0 && node != Root) { // type-dir if(node->type == Directory) { // determine if CD is inside this dir. bool isCD = false; if(node->Child != 0x0) { FileStructureNode* cc = node->Child; while(cc != 0x0 && !isCD) { // search through all of the relatives. if(cc == Current) { isCD = true; break; } else if(cc->Sibling != 0x0) { FileStructureNode* ccd = cc->Sibling; while(ccd != 0x0) { if(ccd == Current) { isCD=true; break; } ccd = ccd->Sibling; } } cc = cc->Child; } } else if(node == Current) { isCD = true; } if(!isCD) { node->del(); } else { // this is restricted by call directory CharString cs = CharString("rmdir: "); cs.concata(location); cs.concata(": directory cannot be deleted",29); this->ErrorString = cs.get(); throw 15; } } else { // cannot find! CharString cs = CharString("rmdir: "); cs.concata(location); cs.concata(": directory does not exist",26); this->ErrorString = cs.get(); throw 8; } } else { // throw error! CharString cs = CharString("rmdir: "); cs.concata(location); cs.concata(": directory does not exist",26); this->ErrorString = cs.get(); throw 7; } }
// if connected, send out a message // returns false if not connected or error. // auto-splits large messages larger than buffer. bool SockClient::sendc(CharString message){ CharString emsg = (encryptor!=0x0) ? encryptor(message) : message; // Apply encryption if(emsg.getSize() <= 2) return false; //cout << "Send message(" << emsg.getSize() << ")" << emsg.get() << endl; cout << "Send message(" << emsg.getSize() << ")"<< endl; int flags=0; int looptimes=1; int i, msgret, msgsize; char* msg; #ifdef LINUXXX if(!testAlive()){ // uh... return false; } if(ctype == SC_TCP){ //msgret = send(sockd, message.get(), message.getSize(), flags); //cout << "Pre-write SC_TCP " << emsg.getSize() << endl; if(testAlive()) msgret = write(sockd, emsg.get(), emsg.getSize()); //cout << "post-write" << endl; }else{ socklen_t addrlen = sizeof(struct sockaddr_in); //msgret = sendto(sockd, emsg.get(), emsg.getSize(), &cli_addr, address); } // detect error if(msgret == -1) return false; #endif return true; }
void Logger::processLog(CharString data){ if(console){ cout << data.get() << endl; cout.flush(); } // push data to file }
/* Returns the name of the end point. * Input: String location * Output: Very ending of string after last "/" */ CharString FileSystem::getNameFromString(CharString location) { // gets the name of the last "/dir/dir2/name", even if it ends with "/". if(location.get()[location.getSize()-1] == '/') { // remove trailing "/". location.get()[location.getSize()-1] = '\0'; location.setSize(location.getSize()-1); } CharString result = CharString(""); // split all by "/". if(location.contains("/")) { // get the very last result of the split. LinkedList<CharString>* sresult = location.split('/','`'); result = *sresult->get(sresult->size()-1); } else { result = location; } return result; }
void testPriorityQueue() { cout << "PriorityQueue => "; PriorityQueue* q = new PriorityQueue(); CharString* cc = new CharString("test@#$%^*()_+1234567890",24); q->insert(0,cc); CharString* qq = (CharString*)q->removeMin(); if(qq == cc) { cout << "Pass" << endl; } else { cout << "Fail" << "(" << qq->get() << ")" << endl; } }
// tests the queue for ability. void testQueue() { cout << "Queue => "; Queue* q = new Queue(); CharString* cc = new CharString("test@#$%^*()_+1234567890"); q->push(cc); CharString* qq = (CharString*)q->pop(); if(qq == cc) { cout << "Pass" << endl; } else { cout << "Fail" << "(" << qq->get() << ")" << endl; } }
void Logger::processLog(CharString data){ if(console){ cout << data;// << endl; cout.flush(); } // push data to file if(file.is_open()){ file.write(data.get(), data.getSize()); file.write((char*)"\n", 1); } }
// if ASYNC, start thread Logger::Logger(CharString logfileloc, CharString prefix, bool async, bool console, bool clearfile){ this->logfileloc = logfileloc; this->prefix = prefix; this->async = async; this->console = console; this->ending = false; //cout << "Logger 1" << endl; // open file if(clearfile) file.open (logfileloc.get(), ios::out | ios::app); else file.open (logfileloc.get(), ios::out | ios::app | ios::trunc); file.seekp(0, ios::end); //cout << "Logger 2" << endl; if(async){ asyncthread = std::thread(loggerThread, this); cout << "Logger 3thrstart" << endl; } //cout << "Logger 3" << endl; }
// Desc: Removes a file from the current directory based on location. // Input: String location void FileSystem::removeFile(CharString location) { FileStructureNode* node = getNodeFromString(location); if(node != 0x0) { // is node available? if(node->type == File) { // is node a file? // directly delete file. node->del(); } else { // else throw DNE error CharString cs = CharString("rm: "); cs.concata(location); cs.concata(": file does not exist",21); this->ErrorString = cs.get(); throw 6; } } else { // else throw DNE error // throw error! CharString cs = CharString("rm: "); cs.concata(location); cs.concata(": file does not exist",21); this->ErrorString = cs.get(); throw 5; } }
// Handle basic client stuff void ClientHandler_(SockClient* tclient) { // Talk with the client, pre-load into a buffer int n; char buffer[BUFFER_SIZEX]; while(tclient->alive) { #if __linux__ || __unix__ n = read(tclient->sockd, buffer, BUFFER_SIZEX); if (n < 0) error("ERROR reading from socket"); CharString* writeto = new CharString(); // writeto is a string that we write to, used by the if(tclient->_clientHandler != 0x0) { tclient->_clientHandler(new CharString(buffer,BUFFER_SIZEX), writeto); n = write(tclient->sockd, writeto->get(), writeto->getSize()); if (n < 0) error("ERROR writing to socket"); } #endif // __linux__ } }
// input redirection void InputRedirection::handleInputLine(CharString* input) { double ii = 0; double time1 = clock()/CLOCKS_PER_SEC; double basetime = clock()/CLOCKS_PER_SEC; if(input->Compare("exit",4)) { this->stop = true; } else if(input->Compare("help",4)) { cout << "[Commands]:" << endl; cout << " test - lists possible tests" << endl; cout << " exit - Exits the program" << endl; } else if(input->Compare("MathTest",8)) { testMath(); } else if(input->Compare("AsmTest",7)) { //testASM(); } else if(input->Compare("ExHashTest",10)) { testExHash(); } else if(input->Compare("PhysTest",8)) { testGravity(); } else if(input->Compare("EngineerTest",12)) { } else if(input->Compare("AbstractDB",10)) { testAbstractDB(); } else if(input->Compare("EventHandler",12)) { testEventHandler(); } else if(input->Compare("GameTest",8)) { } else if(input->Compare("CTest",5)) { CharString* c = new CharString("-12038.22828282302012031929319",30); cout << "STRTEST Float: -" << c->get() << " = " << c->getFloat() << endl; c = new CharString("0.0000000000000000000000000123",30); cout << "STRTEST Float: " << c->get() << " = " << c->getFloat() << endl; c = new CharString("-120382282828230201203.1929319",30); cout << "STRTEST Float: -" << c->get() << " = " << c->getFloat() << endl; c = new CharString("-1.2345e+9",10); cout << "STRTEST Float: -" << c->get() << " = " << c->getFloat() << endl; c = new CharString("1.2345e+120",11); cout << "STRTEST Float: -" << c->get() << " = " << c->getFloat() << endl; } else if(input->Compare("LinearTest",10)) { char* a = new char(); strcpy(a,"[LinearTest] "); testStructures(a); } else if(input->Compare("DataStruTest",12)) { testDataStructures(); } else if(input->Compare("PTypeTest",9)) { testPType(); } else if(input->Compare("SerializerTest",12)) { testSerializers(); } else if(input->Compare("TestALL",8)) { testDataStructures(); testMath(); char a[14]; strcpy(a,"[LinearTest] "); testStructures(a); testGravity(); //testASM(); } else if(input->Compare("test",4)) { cout << "[Tests]:" << endl; cout << " AbstractDB - tests the Abstract Database" << endl; cout << " AsmTest - tests embedded assembler" << endl; cout << " ExHashTest - tests embedded assembler" << endl; cout << " MathTest - tests basic math systems" << endl; cout << " LinearTest - tests linear algebra" << endl; cout << " GameTest - tests backend game systems" << endl; cout << " EventHandler - tests Event Handler" << endl; cout << " EngineerTest - tests Engineering systems" << endl; cout << " PhysTest - tests Physics systems" << endl; cout << " DataStruTest - tests Data structures" << endl; cout << " NetworkTest - tests Networking systems (P2p, Server, Client, ect)" << endl; cout << " RenderTest - tests rendering systems" << endl; cout << " SerializerTest- tests rendering systems" << endl; cout << " TestALL - tests all the above" << endl; } else { cout << "Unknown command; Try `help`." << endl; } double totalTime = ((double)clock()/CLOCKS_PER_SEC) - basetime; cout << "Total test time: " << totalTime*1000 << " Milliseconds" << endl; }
/* * Desc: Takes in a single line and expresses the line in a math formula to solve it. * Input: CharString* Line. * Output: (Console) Output of all expressions. * */ CharString Eval(CharString Line) { //cout << line << endl; // get length of line int lsize = 0; for(int i=0; i<Line.getSize(); i++) { if(Line.get()[i] != 0x0) { lsize++; } } Line.setSize(lsize); // PARSE each section. Format SHOULD be like this: // 1 + 2 [number operator number] // 1 + 2 * 3 [n o n o n] // 1 + 5 * 10^2 [n o n o non] // 110/ 98 [no n] (Automatic parse finding) // list of operators: // () + - / * ^ % < > = <= >= [NOTE that as of this time, parentheses will not be used] // Thus, it can be infered that we can break up each system by placing the most important // System (order of operations) on the top of the stack and placing the least important // +/- at the bottom of the stack... // Order of operations: // ^ / * + - (>= = <= < > [END-CLASS operators]) // Parse method: // 1.) loop-through n times to get full stack. NumStack = new Stack(); // NumStack is used to store the initial numbers OpStack = new Stack(); // OpStack is used to store the initial operators // note that both stacks store information through the same MathOperationNode Type. // This will be solved later when we interlace the operators with the variables. char* LineD = Line.get(); char* NumTemp = new char(); int NumTempLen = 0; MOperator OpTemp = none; for(int i=0; i<Line.getSize(); i++) { char g = LineD[i]; MOperator tOp = getOperatorFromChar(g); if(isCharNumber(g)) { // is this a number? // this is a single digit for NumTemp. Add to it. NumTemp[NumTempLen] = g; NumTempLen++; // dump OpTemp if it is available. dumpOp(OpTemp); OpTemp = none; } else if (tOp != none) { if(OpTemp != none) { MOperator gox = combineOperators(tOp,OpTemp); if(gox != none) OpTemp = gox; } else { OpTemp = tOp; } // dump NumTemp if it is available. dumpNum(NumTemp,NumTempLen); NumTempLen=0; } else { // dump NumTemp if it is available. // dump OpTemp if it is available. dumpNum(NumTemp,NumTempLen); NumTempLen=0; dumpOp(OpTemp); OpTemp = none; } } // dump NumTemp if it is available. // dump OpTemp if it is available. dumpNum(NumTemp,NumTempLen); NumTempLen=0; dumpOp(OpTemp); OpTemp = none; while(OpStack->size > 0) { int res = doOp(); //cout << "=" << res << endl; NumStack->push(res); } int c = NumStack->pop(); if(c == -98) cout << "F"; else if(c == -99) cout << "T"; else cout << c; return CharString::ConvertFromInt(c); }