Main Page   Namespace List   Class Hierarchy   Alphabetical List   Compound List   File List   Compound Members  

ccodegeneratorvisitor.cpp

Go to the documentation of this file.
00001 #include "ccodegeneratorvisitor.h"
00002 #include "protomake.h"
00003 #include <vector>
00004 #include <typeinfo>
00005 using namespace std;
00006 
00007 VisitorReturn *CCodeGeneratorVisitor::visitAction(Action *action) {
00008         VisitorReturn *v;
00009         return v;
00010 }
00011 
00012 VisitorReturn *CCodeGeneratorVisitor::visitActStatement(ActStatement *actStatement) {
00013         VisitorReturn *v;
00014         return v;
00015 }
00016 
00017 VisitorReturn *CCodeGeneratorVisitor::visitArrayReference(ArrayReference *arrayReference) {
00018         VisitorReturn *v;
00019         return v;
00020 }
00021 
00022 VisitorReturn *CCodeGeneratorVisitor::visitArrayType(ArrayType *arrayType) {
00023         VisitorReturn *v;
00024         return v;
00025 }
00026 
00027 VisitorReturn *CCodeGeneratorVisitor::visitAssignStatement(AssignStatement *assignStatement) {
00028         VisitorReturn *v;
00029         return v;
00030 }
00031 
00032 VisitorReturn *CCodeGeneratorVisitor::visitAst(Ast *ast) {
00033         VisitorReturn *v;
00034         return v;
00035 }
00036 
00037 VisitorReturn *CCodeGeneratorVisitor::visitBehavior(Behavior *behavior) {
00038         VisitorReturn *v;
00039         return v;
00040 }
00041 
00042 VisitorReturn *CCodeGeneratorVisitor::visitBehaviorStatement(BehaviorStatement *behaviorStatement) {
00043         VisitorReturn *v;
00044         return v;
00045 }
00046 
00047 VisitorReturn *CCodeGeneratorVisitor::visitBinaryExpression(BinaryExpression *binaryExpression) {
00048         VisitorReturn *v;
00049         return v;
00050 }
00051 
00052 VisitorReturn *CCodeGeneratorVisitor::visitDeclaration(Declaration *declaration) {
00053         VisitorReturn *v;
00054         return v;
00055 }
00056 
00057 VisitorReturn *CCodeGeneratorVisitor::visitDoStatement(DoStatement *doStatement) {
00058         VisitorReturn *v;
00059         return v;
00060 }
00061 
00062 VisitorReturn *CCodeGeneratorVisitor::visitExpression(Expression *expression) {
00063         VisitorReturn *v;
00064         return v;
00065 }
00066 
00067 VisitorReturn *CCodeGeneratorVisitor::visitExpressionList(ExpressionList *expressionList) {
00068         VisitorReturn *v;
00069         return v;
00070 }
00071 
00072 VisitorReturn *CCodeGeneratorVisitor::visitFieldDeclaration(FieldDeclaration *fieldDeclaration) {
00073         VisitorReturn *v;
00074         return v;
00075 }
00076 
00077 VisitorReturn *CCodeGeneratorVisitor::visitFieldReference(FieldReference *fieldReference) {
00078         VisitorReturn *v;
00079         return v;
00080 }
00081 
00082 VisitorReturn *CCodeGeneratorVisitor::visitFieldType(FieldType *fieldType) {
00083         VisitorReturn *v;
00084         return v;
00085 }
00086 
00087 VisitorReturn *CCodeGeneratorVisitor::visitGuard(Guard *guard) {
00088         VisitorReturn *v;
00089         return v;
00090 }
00091 
00092 VisitorReturn *CCodeGeneratorVisitor::visitGuardedStatement(GuardedStatement *guardedStatement) {
00093         VisitorReturn *v;
00094         return v;
00095 }
00096 
00097 VisitorReturn *CCodeGeneratorVisitor::visitGuardExpression(GuardExpression *guardExpression) {
00098         VisitorReturn *v;
00099         return v;
00100 }
00101 
00102 VisitorReturn *CCodeGeneratorVisitor::visitGuardReceive(GuardReceive *guardReceive) {
00103         VisitorReturn *v;
00104         return v;
00105 }
00106 
00107 VisitorReturn *CCodeGeneratorVisitor::visitGuardTimeout(GuardTimeout *guardTimeout) {
00108         VisitorReturn *v;
00109         return v;
00110 }
00111 
00112 VisitorReturn *CCodeGeneratorVisitor::visitIdentifier(Identifier *identifier) {
00113         VisitorReturn *v;
00114         return v;
00115 }
00116 
00117 VisitorReturn *CCodeGeneratorVisitor::visitIdentifierList(IdentifierList *identifierList) {
00118         VisitorReturn *v;
00119         return v;
00120 }
00121 
00122 VisitorReturn *CCodeGeneratorVisitor::visitIfStatement(IfStatement *ifStatement) {
00123         VisitorReturn *v;
00124         return v;
00125 }
00126 
00127 VisitorReturn *CCodeGeneratorVisitor::visitImport(Import *import) {
00128         VisitorReturn *v;
00129         return v;
00130 }
00131 
00132 VisitorReturn *CCodeGeneratorVisitor::visitIntegerLiteral(IntegerLiteral *integerLiteral) {
00133         VisitorReturn *v;
00134         return v;
00135 }
00136 
00137 VisitorReturn *CCodeGeneratorVisitor::visitLeftSide(LeftSide *leftSide) {
00138         VisitorReturn *v;
00139         return v;
00140 }
00141 
00142 VisitorReturn *CCodeGeneratorVisitor::visitLeftSideList(LeftSideList *leftSideList) {
00143         VisitorReturn *v;
00144         return v;
00145 }
00146 
00147 VisitorReturn *CCodeGeneratorVisitor::visitMessage(Message *message) {
00148         VisitorReturn *v;
00149         
00150         return v;
00151 }
00152 
00153 VisitorReturn *CCodeGeneratorVisitor::visitMultipleArrayReference(MultipleArrayReference *multipleArrayReference) {
00154         VisitorReturn *v;
00155         return v;
00156 }
00157 
00158 VisitorReturn *CCodeGeneratorVisitor::visitProcess(Process *process) {
00159         VisitorReturn *v;
00160         return v;
00161 }
00162 
00163 // Terminado!
00164 VisitorReturn *CCodeGeneratorVisitor::visitProgram(Program *program) {
00165         VisitorReturn *v = 0;
00166 
00167         if(program->getImport())
00168                 program->getImport()->visit(*this); // Não está sendo considerado ainda
00169         if(program->getBehavior())
00170                 program->getBehavior()->visit(*this); // Não está sendo considerado ainda
00171 
00172         // Creating messages files!
00173         this->hFile.open("./code/messages.h");
00174         this->cFile.open("./code/messages.c");
00175 
00176         if (hFile.is_open() && cFile.is_open()) {
00177                 hFile << "\n\n";
00186                 
00187                 hFile << "#ifndef _MESSAGES_H_\n";
00188                 hFile << "#define _MESSAGES_H_\n\n";
00189         
00190                 hFile << "#include <netinet/in.h>\n";
00191                 hFile << "#include <stdint.h>\n\n";
00192 
00193                 hFile << "#ifndef _PM_BYTE_TYPE_\n";
00194                 hFile << "#define _PM_BYTE_TYPE_\n";
00195                 hFile << "\ttypedef unsigned char byte;\n";
00196                 hFile << "#endif\n\n";
00197 
00198                 cFile << "#include <string.h>\n";
00199                 cFile << "#include <stdlib.h>\n";
00200                 cFile << "#include \"messages.h\"\n\n";
00201         }
00202         else {
00203                 cerr << "Unable to create messages.h and messages.c!\n";
00204                 exit(1);
00205         }
00206         program->getMessage()->visit(*this); 
00207         hFile << "#endif\n";
00208 
00209         hFile.close();
00210         cFile.close();
00211         
00212 
00213 // Creating process files!
00214 //      this->hFile.open("./code/processes.h");
00215 //      this->cFile.open("./code/processes.c");
00216         this->cFile.open("./code/server.c");
00217 
00218 
00219         if ( cFile.is_open()) {
00220 /*              hFile << "
00255 // Escrita do servidor do cliente. GAMBIARRA temporária!!
00256                 cFile << "#include \"cpmsocket.h\"\n";
00257                 cFile << "#include \"messages.h\"\n\n";
00258                 cFile << "int main(void)\n{\n";
00259                 cFile << "\tPMSocket *server = pmsocket_open(\"127.0.0.1\", 9986, TCP);\n";
00260                 cFile << "\tbyte buffer[14];\n\n";
00261                 cFile << "\tpmsocket_accept(server, 10);\n";
00262                 cFile << "\tpmsocket_recv(server, buffer, 14, NULL);\n";
00263                 cFile << "\tpmsocket_close(server);\n\n";
00264                 cFile << "\treturn 0;\n}\n";
00265                 cFile.close();
00266 
00267                 cFile.open("./code/client.c");
00268                 if (cFile.is_open()) {
00269                         cFile << "#include \"cpmsocket.h\"\n";
00270                         cFile << "#include \"messages.h\"\n\n";
00271                         cFile << "int main(void)\n{\n";
00272                         cFile << "\tPMSocket *server = pmsocket_connect(\"127.0.0.1\", 9986);\n";
00273                         cFile << "\tmessage_one msg;\n";
00274                         cFile << "\tbyte *buffer;\n\n";
00275                         cFile << "\tmsg.length = 10;\n\tmsg.msg = (byte *) malloc(msg.length);\n";
00276                         cFile << "\tmemcpy(msg.msg, \"projeto-R2\", 10);\n";
00277                         cFile << "\tmsg.flags = 3;\n";
00278                         cFile << "\tbuffer = message_one_serialize(&msg, NULL);\n";
00279                         cFile << "\tpmsocket_send(server, buffer, 14);\n";
00280                         cFile << "\tpmsocket_close(server);\n\n";
00281                         cFile << "\treturn 0;\n}\n";
00282                 }
00283         }
00284         else {
00285                 cerr << "Unable to create processes.h and processes.c!\n";
00286                 exit(1);
00287         }
00288 
00289         program->getProcess()->visit(*this);
00290 
00291         return v;
00292 }
00293 
00294 VisitorReturn *CCodeGeneratorVisitor::visitRangeType(RangeType *rangeType) {
00295         VisitorReturn *v;
00296         return v;
00297 }
00298 
00299 VisitorReturn *CCodeGeneratorVisitor::visitReceiveStatement(ReceiveStatement *receiveStatement) {
00300         VisitorReturn *v;
00301         return v;
00302 }
00303 
00304 VisitorReturn *CCodeGeneratorVisitor::visitSendStatement(SendStatement *sendStatement) {
00305         VisitorReturn *v;
00306         return v;
00307 }
00308 
00309 VisitorReturn *CCodeGeneratorVisitor::visitSequentialAction(SequentialAction *sequentialAction) {
00310         VisitorReturn *v;
00311         return v;
00312 }
00313 
00314 VisitorReturn *CCodeGeneratorVisitor::visitSequentialBehavior(SequentialBehavior *sequentialBehavior) {
00315         VisitorReturn *v;
00316         return v;
00317 }
00318 
00319 VisitorReturn *CCodeGeneratorVisitor::visitSequentialDeclaration(SequentialDeclaration *sequentialDeclaration) {
00320         VisitorReturn *v;
00321 
00322         sequentialDeclaration->getDeclaration()->visit(*this);
00323         sequentialDeclaration->getSimpleDeclaration()->visit(*this);
00324         
00325         return v;
00326 }
00327 
00328 VisitorReturn *CCodeGeneratorVisitor::visitSequentialExpressionList(SequentialExpressionList *sequentialExpressionList) {
00329         VisitorReturn *v;
00330         return v;
00331 }
00332 
00333 VisitorReturn *CCodeGeneratorVisitor::visitSequentialFieldDeclaration(SequentialFieldDeclaration *sequentialFieldDeclaration) {
00334         VisitorReturn *v1, *v2;
00335 
00336         v1 = sequentialFieldDeclaration->getFieldDeclaration()->visit(*this);
00337         v2 = sequentialFieldDeclaration->getSimpleFieldDeclaration()->visit(*this);
00338 
00339         v1->fields.push_back(v2->fields[0]);
00340         
00341         return v1;
00342 }
00343 
00344 VisitorReturn *CCodeGeneratorVisitor::visitSequentialGuardedStatement(SequentialGuardedStatement *sequentialGuardedStatement) {
00345         VisitorReturn *v;
00346         return v;
00347 }
00348 
00349 VisitorReturn *CCodeGeneratorVisitor::visitSequentialIdentifierList(SequentialIdentifierList *sequentialIdentifierList) {
00350         VisitorReturn *v;
00351         return v;
00352 }
00353 
00354 VisitorReturn *CCodeGeneratorVisitor::visitSequentialImport(SequentialImport *sequentialImport) {
00355         VisitorReturn *v;
00356         return v;
00357 }
00358 
00359 VisitorReturn *CCodeGeneratorVisitor::visitSequentialLeftSideList(SequentialLeftSideList *sequentialLeftSideList) {
00360         VisitorReturn *v;
00361         return v;
00362 }
00363 
00364 VisitorReturn *CCodeGeneratorVisitor::visitSequentialMessage(SequentialMessage *sequentialMessage) {
00365         VisitorReturn *v = 0;
00366 
00367         sequentialMessage->getMessage()->visit(*this);
00368         sequentialMessage->getSimpleMessage()->visit(*this);
00369         
00370         return v;
00371 }
00372 
00373 VisitorReturn *CCodeGeneratorVisitor::visitSequentialProcess(SequentialProcess *sequentialProcess) {
00374         VisitorReturn *v = 0;
00375 
00376         sequentialProcess->getProcess()->visit(*this);
00377         sequentialProcess->getSimpleProcess()->visit(*this);
00378 
00379         return v;
00380 }
00381 
00382 VisitorReturn *CCodeGeneratorVisitor::visitSequentialStatement(SequentialStatement *sequentialStatement) {
00383         VisitorReturn *v;
00384         return v;
00385 }
00386 
00387 VisitorReturn *CCodeGeneratorVisitor::visitSimpleAction(SimpleAction *simpleAction) {
00388         VisitorReturn *v;
00389         return v;
00390 }
00391 
00392 VisitorReturn *CCodeGeneratorVisitor::visitSimpleArrayReference(SimpleArrayReference *simpleArrayReference) {
00393         VisitorReturn *v;
00394         return v;
00395 }
00396 
00397 VisitorReturn *CCodeGeneratorVisitor::visitSimpleBehavior(SimpleBehavior *simpleBehavior) {
00398         VisitorReturn *v;
00399         return v;
00400 }
00401 
00402 VisitorReturn *CCodeGeneratorVisitor::visitSimpleDeclaration(SimpleDeclaration *simpleDeclaration) {
00403         VisitorReturn *v;
00404 
00405         return v;
00406 }
00407 
00408 VisitorReturn *CCodeGeneratorVisitor::visitSimpleExpressionList(SimpleExpressionList *simpleExpressionList) {
00409         VisitorReturn *v;
00410         return v;
00411 }
00412 
00413 VisitorReturn *CCodeGeneratorVisitor::visitSimpleFieldDeclaration(SimpleFieldDeclaration *simpleFieldDeclaration) {
00414         VisitorReturn *v = new VisitorReturn;
00415         v->fields.push_back(simpleFieldDeclaration);
00416 
00417         Expression *expr = simpleFieldDeclaration->getFieldType()->getExpression();
00418 
00419         hFile << "\t";
00420         if (typeid(*expr) == typeid(IntegerLiteral)) {
00421                 if (simpleFieldDeclaration->getFieldType()->getType() == FieldType::BYTE)
00422                         hFile << "byte *";
00423                 
00424                 else if (simpleFieldDeclaration->getFieldType()->getType() == FieldType::BIT) {
00425                         IntegerLiteral *il = dynamic_cast<IntegerLiteral*> (expr);
00426 
00427                         if (il->getValue() <= 8)
00428                                 hFile << "byte ";
00429                         else if (il->getValue() <= 16)
00430                                 hFile << "uint16_t ";
00431                         else if (il->getValue() <= 32)
00432                                 hFile << "uint32_t ";
00433                 }
00434         }
00435         else if (typeid(*expr) == typeid(Identifier))
00436                 hFile << "byte *";
00437         
00438         hFile << simpleFieldDeclaration->getIdentifier()->getName() << ";\n";
00439         
00440         return v;
00441 }
00442 
00443 VisitorReturn *CCodeGeneratorVisitor::visitSimpleGuardedStatement(SimpleGuardedStatement *simpleGuardedStatement) {
00444         VisitorReturn *v;
00445         return v;
00446 }
00447 
00448 VisitorReturn *CCodeGeneratorVisitor::visitSimpleIdentifierList(SimpleIdentifierList *simpleIdentifierList) {
00449         VisitorReturn *v;
00450         return v;
00451 }
00452 
00453 VisitorReturn *CCodeGeneratorVisitor::visitSimpleImport(SimpleImport *simpleImport) {
00454         VisitorReturn *v;
00455         return v;
00456 }
00457 
00458 VisitorReturn *CCodeGeneratorVisitor::visitSimpleLeftSideList(SimpleLeftSideList *simpleLeftSideList) {
00459         VisitorReturn *v;
00460         return v;
00461 }
00462 
00463 VisitorReturn *CCodeGeneratorVisitor::visitSimpleMessage(SimpleMessage *simpleMessage) {
00464         VisitorReturn *v;
00465         static int code = 1;
00466         string name = simpleMessage->getIdentifier()->getName();
00467 
00468 // Generate correct header for the messages.c file!
00469         hFile << "typedef struct {\n";
00470         v = simpleMessage->getFieldDeclaration()->visit(*this);
00471         hFile << "} message_" << name << ";\n\n";
00472 
00473         hFile << "byte *message_" << name << "_serialize(const message_" << name;
00474         hFile << " *msg_" << name << ", byte *buffer);\n";
00475 
00476         hFile << "message_" << name << " *message_" << name << "_unserialize(";
00477         hFile << "const byte *buffer, message_" << name << " *msg_" << name << ");\n\n";
00478         
00479 
00480 // Generate the implementation for the prototypes declared in message.h!
00481 // Serialize the struct
00482         cFile << "byte *message_" << name << "_serialize(const message_" << name;
00483         cFile << " *msg_" << name << ", byte *buffer) {\n";
00484 
00485         cFile << "\tuint16_t code = htons(" << code << ");\n";
00486         cFile << "\tuint32_t offset = 0;\n";
00487     cFile << "\tuint16_t temp16 = 0;\n";
00488     cFile << "\tuint32_t temp32 = 0;\n";
00489         cFile << "\tbyte *buf;\n\n";
00490         cFile << "\tbuf = (byte *) malloc((";
00491 
00492 // Allocate the correct size for the buffer
00493         for (vector<SimpleFieldDeclaration*>::iterator itr = v->fields.begin();
00494                  itr != v->fields.end();
00495                  itr++) {
00496                 if (itr != v->fields.begin())
00497                         cFile << " + ";
00498                         
00499                 Expression *expr = (*itr)->getFieldType()->getExpression();
00500         
00501                 if (typeid(*expr) == typeid(IntegerLiteral)) {
00502                         IntegerLiteral *il = dynamic_cast<IntegerLiteral*> (expr);
00503                         
00504                         if ((*itr)->getFieldType()->getType() == FieldType::BYTE)
00505                                 cFile << il->getValue();
00506                         
00507                         else if ((*itr)->getFieldType()->getType() == FieldType::BIT) {
00508         
00509                                 if (il->getValue() <= 8)
00510                                         cFile << "1";
00511                                 else if (il->getValue() <= 16)
00512                                         cFile << "2";
00513                                 else if (il->getValue() <= 32)
00514                                         cFile << "4";
00515                         }
00516                 }
00517                 else if (typeid(*expr) == typeid(Identifier))
00518                         cFile << "msg_" << name << "->" << (dynamic_cast<Identifier*> (expr))->getName();
00519         }
00520         cFile << ") * sizeof(byte));\n\n";
00521         cFile << "\tmemcpy(buf, &code, 2);\n";
00522         cFile << "\toffset = 2;\n\n";
00523 
00524         for (vector<SimpleFieldDeclaration*>::iterator itr = v->fields.begin();
00525                  itr != v->fields.end();
00526                  itr++) {
00527                 Expression *expr = (*itr)->getFieldType()->getExpression();
00528 
00529                 if (typeid(*expr) == typeid(IntegerLiteral)) {
00530                         IntegerLiteral *il = dynamic_cast<IntegerLiteral*> (expr);
00531                         
00532                         if ((*itr)->getFieldType()->getType() == FieldType::BYTE) {
00533                         cFile << "\tmemcpy((buf + offset), ";
00534                                 cFile << "msg_" << name << "->" << (*itr)->getIdentifier()->getName();
00535                                 cFile << ", " << il->getValue() << ");\n"; 
00536                                 cFile << "\toffset += " << il->getValue() << ";\n\n";
00537                         }
00538                         
00539                         else if ((*itr)->getFieldType()->getType() == FieldType::BIT) {
00540                                 if (il->getValue() > 8 && il->getValue() <= 16) {
00541                                         cFile << "\ttemp16 = htons(msg_" << name << "->" << (*itr)->getIdentifier()->getName();
00542                     cFile << ");\n";
00543                 }
00544                 
00545                                 else if (il->getValue() > 16 && il->getValue() <= 32) {
00546                                         cFile << "\ttemp32 = htonl(msg_" << name << "->" << (*itr)->getIdentifier()->getName();
00547                     cFile << ");\n";
00548                 }
00549                 
00550                 cFile << "\tmemcpy((buf + offset), ";
00551         
00552                                 if (il->getValue() <= 8) {
00553                     cFile << "&(msg_" << name << "->" << (*itr)->getIdentifier()->getName() << "), ";
00554                                         cFile << "1);\n\toffset += 1;\n\n";
00555                 }
00556                                 else if (il->getValue() <= 16)
00557                                         cFile << "&temp16, 2);\n\toffset += 2;\n\n";
00558                                 else if (il->getValue() <= 32)
00559                                         cFile << "&temp32, 4);\n\toffset += 4;\n\n";
00560                         }
00561                 }
00562                 else if (typeid(*expr) == typeid(Identifier)) {
00563             cFile << "\tmemcpy((buf + offset), ";
00564             cFile << "msg_" << name << "->" << (*itr)->getIdentifier()->getName() << ", ";
00565                         cFile << "msg_" << name << "->" << (dynamic_cast<Identifier*> (expr))->getName() << ");\n";
00566                         cFile << "\toffset += msg_" << name << "->";
00567                         cFile << (dynamic_cast<Identifier*> (expr))->getName() << ";\n\n";
00568                 }
00569         }
00570         cFile << "\tif (buffer != NULL) {\n";
00571         cFile << "\t\tmemmove(buffer, buf, offset);\n";
00572         cFile << "\t\tfree(buf);\n\t\tbuf = NULL;\n\t}\n\n";
00573         cFile << "\treturn buf;\n}\n\n";
00574 
00575 
00576 // Unserialize the buffer
00577         cFile << "message_" << name << " *message_" << name << "_unserialize(";
00578         cFile << "const byte *buffer, message_" << name << " *msg_" << name << ") {\n";
00579         
00580         cFile << "\tmessage_" << name << " *msg = (message_" << name << " *) ";
00581         cFile << "malloc(sizeof(message_" << name << "));\n";
00582         cFile << "\tuint32_t offset = 2;\n\n";
00583         
00584         for (vector<SimpleFieldDeclaration*>::iterator itr = v->fields.begin();
00585                  itr != v->fields.end();
00586                  itr++) {
00587                 Expression *expr = (*itr)->getFieldType()->getExpression();
00588 
00589                 if (typeid(*expr) == typeid(IntegerLiteral)) {
00590                         IntegerLiteral *il = dynamic_cast<IntegerLiteral*> (expr);
00591                         
00592                         if ((*itr)->getFieldType()->getType() == FieldType::BYTE) {
00593                                 cFile << "\tmemcpy(msg_" << name << "->" << (*itr)->getIdentifier()->getName();
00594                                 cFile << ", (buffer + offset), " << il->getValue() << ");\n"; 
00595                                 cFile << "\toffset += " << il->getValue() << ";\n\n";
00596                         }
00597                         
00598                         else if ((*itr)->getFieldType()->getType() == FieldType::BIT) {
00599                                 cFile << "\tmemcpy(&(msg_" << name << "->" << (*itr)->getIdentifier()->getName();
00600                                 cFile << "), (buffer + offset), ";
00601         
00602                                 if (il->getValue() <= 8)
00603                                         cFile << "1);\n\toffset += 1;\n\n";
00604                                 else if (il->getValue() <= 16) {
00605                                         cFile << "2);\n\toffset += 2;\n";
00606                     cFile << "\tmsg_" << name << "->" << (*itr)->getIdentifier()->getName() << " = ";
00607                     cFile << "ntohs(msg_" << name << "->" << (*itr)->getIdentifier()->getName() << ");\n\n";
00608                 }
00609                                 else if (il->getValue() <= 32) {
00610                                         cFile << "4);\n\toffset += 4;\n";
00611                     cFile << "\tmsg_" << name << "->" << (*itr)->getIdentifier()->getName() << " = ";
00612                     cFile << "ntohl(msg_" << name << "->" << (*itr)->getIdentifier()->getName() << ");\n\n";
00613                 }
00614                         }
00615                 }
00616                 else if (typeid(*expr) == typeid(Identifier)) {
00617                         cFile << "\tmemcpy(msg_" << name << "->" << (*itr)->getIdentifier()->getName();
00618                         cFile << ", (buffer + offset), ";
00619                         cFile << "msg_" << name << "->" << (dynamic_cast<Identifier*> (expr))->getName() << ");\n";
00620                         cFile << "\toffset += msg_" << name << "->";
00621                         cFile << (dynamic_cast<Identifier*> (expr))->getName() << ";\n\n";
00622                 }
00623         }
00624         
00625         cFile << "\tif (msg_" << name << " != NULL) {\n";
00626         cFile << "\t\tmemmove(msg_" << name << ", msg, offset);\n";
00627         cFile << "\t\tfree(msg);\n\t\tmsg = NULL;\n\t}\n\n";
00628         cFile << "\treturn msg;\n}\n\n";
00629         
00630 // Increment the code for the next message
00631         code++;
00632         
00633         return v;
00634 }
00635 
00636 VisitorReturn *CCodeGeneratorVisitor::visitSimpleProcess(SimpleProcess *simpleProcess) {
00637         VisitorReturn *v = new VisitorReturn();
00638         string name = simpleProcess->getIdentifier()->getName();
00639 
00640         hFile << "typedef struct {\n";
00641         hFile << "\tthreadData data;\n";
00642         simpleProcess->getDeclaration()->visit(*this);
00643         hFile << "} processData;\n\n";
00644         
00645         hFile << "processData " << name << "_proc;\n";
00646         hFile << "processData " << name << "_recp;\n\n";
00647         
00648         hFile << "void *proc_" << name << "(void *args);\n";
00649         hFile << "void *recp_" << name << "(void *args);\n\n";
00650         
00651         
00652         return v;
00653 }
00654 
00655 VisitorReturn *CCodeGeneratorVisitor::visitSimpleStatement(SimpleStatement *simpleStatement) {
00656         VisitorReturn *v;
00657         return v;
00658 }
00659 
00660 VisitorReturn *CCodeGeneratorVisitor::visitSkipStatement(SkipStatement *skipStatement) {
00661         VisitorReturn *v;
00662         return v;
00663 }
00664 
00665 VisitorReturn *CCodeGeneratorVisitor::visitStartStatement(StartStatement *startStatement) {
00666         VisitorReturn *v;
00667         return v;
00668 }
00669 
00670 VisitorReturn *CCodeGeneratorVisitor::visitStatement(Statement *statement) {
00671         VisitorReturn *v;
00672         return v;
00673 }
00674 
00675 VisitorReturn *CCodeGeneratorVisitor::visitStopStatement(StopStatement *stopStatement) {
00676         VisitorReturn *v;
00677         return v;
00678 }
00679 
00680 VisitorReturn *CCodeGeneratorVisitor::visitStringLiteral(StringLiteral *stringLiteral) {
00681         VisitorReturn *v;
00682         return v;
00683 }
00684 
00685 VisitorReturn *CCodeGeneratorVisitor::visitType(Type *type) {
00686         VisitorReturn *v;
00687         return v;
00688 }
00689 
00690 VisitorReturn *CCodeGeneratorVisitor::visitUnaryExpression(UnaryExpression *unaryExpression) {
00691         VisitorReturn *v;
00692         return v;
00693 }
00694 

Generated on Mon Dec 1 17:36:37 2003 for Protomake by doxygen1.3