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