LCOV - code coverage report
Current view: top level - /Users/moyix/git/vrml - vrml_parser.cpp (source / functions) Coverage Total Hit
Test: vrml_claude.info Lines: 90.4 % 345 312
Test Date: 2024-03-08 16:33:03 Functions: 92.3 % 26 24

            Line data    Source code
       1              : #include "vrml_parser.h"
       2              : 
       3              : 
       4              : 
       5              : 
       6              : GlobalVar *gvar = NULL;
       7              : 
       8              : /*************************************************************************************/
       9              : 
      10              : /*************************************************************************************/
      11              : 
      12              : 
      13          663 : void init_gvar(map<string, DataType> *node_type_map, map<DataType, DataSup *> *type_sup_map,
      14              :                map<string, DataType> *field_type_map, stack<string> *file_stack,
      15              :                map<string, Container *> *def_map, map<string, void *> *def_map2)
      16              : {
      17          663 :     if (gvar == NULL) {
      18          663 :         gvar = new GlobalVar;
      19          663 :     }
      20              : 
      21          663 :     gvar->node_type_map = node_type_map;
      22          663 :     gvar->type_sup_map = type_sup_map;
      23          663 :     gvar->field_type_map = field_type_map;
      24          663 :     gvar->file_stack = file_stack;
      25          663 :     gvar->def_map = def_map;
      26          663 :     gvar->def_map2 = def_map2;
      27          663 :     gvar->frame = NULL;
      28          663 :     gvar->def_flag = 0;
      29          663 :     gvar->use_flag = 0;
      30          663 :     gvar->def_tokn = "";
      31          663 :     gvar->use_tokn = "";
      32          663 : }
      33              : 
      34              : /*************************************************************************************/
      35              : 
      36              : /*************************************************************************************/
      37              : 
      38       152769 : map<string, DataType> *get_node_type_map()
      39              : {
      40       152769 :     return gvar->node_type_map;
      41              : }
      42              : 
      43              : 
      44              : /*************************************************************************************/
      45              : 
      46              : /*************************************************************************************/
      47              : 
      48       168011 : map<DataType, DataSup *> *get_type_sup_map()
      49              : {
      50       168011 :     return gvar->type_sup_map;
      51              : }
      52              : 
      53              : 
      54              : /*************************************************************************************/
      55              : 
      56              : /*************************************************************************************/
      57              : 
      58            0 : map<string, Container *> *get_def_map()
      59              : {
      60            0 :     return gvar->def_map;
      61              : }
      62              : 
      63              : /*************************************************************************************/
      64              : 
      65              : /*************************************************************************************/
      66              : 
      67        15242 : map<string, DataType> *get_field_type_map()
      68              : {
      69        15242 :     return gvar->field_type_map;
      70              : }
      71              : 
      72              : 
      73              : /*************************************************************************************/
      74              : 
      75              : /* Stack */
      76              : 
      77              : /*************************************************************************************/
      78              : 
      79              : 
      80          663 : void init_stack(stack<string> **file_stack)
      81              : {
      82              : 
      83          663 :     if (*file_stack == NULL) {
      84          663 :         *file_stack = new stack<string>;
      85          663 :     }
      86          663 : }
      87              : 
      88              : /*************************************************************************************/
      89              : 
      90              : /*************************************************************************************/
      91              : 
      92       381158 : int check_tokn_to_add_stack(string tokn)
      93              : {
      94       381158 :     int value = 0;
      95       381158 :     map<string, DataType> *node_type_map = NULL;
      96       381158 :     map<string, DataType>::iterator node_type_map_it;
      97              : 
      98       381158 :     node_type_map = gvar->node_type_map;
      99       381158 :     node_type_map_it = node_type_map->find(tokn);
     100              : 
     101       381158 :     if (node_type_map) {
     102              : 
     103       381158 :         if (tokn.find("{") != string::npos) {
     104        32545 :             value = 1;
     105       381158 :         } else if (tokn.find("}") != string::npos) {
     106        32142 :             value = 1;
     107       348613 :         } else if (node_type_map_it != node_type_map->end()) {
     108        32549 :             value = 1;
     109        32549 :         }
     110       381158 :     }
     111              : 
     112       381158 :     return value;
     113              : }
     114              : 
     115              : /*************************************************************************************/
     116              : 
     117              : /*************************************************************************************/
     118              : 
     119       128087 : string top_stack()
     120              : {
     121       128087 :     stack<string> *file_stack = NULL;
     122       128087 :     file_stack = gvar->file_stack;
     123       128087 :     string value;
     124              : 
     125       128087 :     if (file_stack) {
     126       128087 :         value = file_stack->top();
     127       128087 :     }
     128              : 
     129       128087 :     return value;
     130       128087 : }
     131              : 
     132              : /*************************************************************************************/
     133              : 
     134              : /*************************************************************************************/
     135              : 
     136        95135 : int check_matching_bracket(string tokn)
     137              : {
     138        95135 :     int value = 0;
     139              : 
     140        95135 :     if (top_stack() == "{" && tokn == "}") {
     141        32142 :         value = 1;
     142        32142 :     }
     143        95135 :     return value;
     144              : }
     145              : 
     146              : /*************************************************************************************/
     147              : 
     148              : /*************************************************************************************/
     149              : 
     150        32142 : int top_is_bracket()
     151              : {
     152        32142 :     int value = 0;
     153        32142 :     string top;
     154              : 
     155        32142 :     top = top_stack();
     156              : 
     157        32142 :     if (top == "}" || top == "{") {
     158            0 :         value = 1;
     159            0 :     }
     160        32142 :     return value;
     161        32142 : }
     162              : 
     163              : /*************************************************************************************/
     164              : 
     165              : /*************************************************************************************/
     166              : 
     167       123275 : int size_stack()
     168              : {
     169       123275 :     stack<string> *file_stack = NULL;
     170       123275 :     file_stack = gvar->file_stack;
     171       123275 :     int value = 0;
     172              : 
     173       123275 :     if (file_stack) {
     174       123275 :         value = file_stack->size();
     175       123275 :     }
     176              : 
     177       123275 :     return value;
     178              : }
     179              : 
     180              : /*************************************************************************************/
     181              : 
     182              : /*************************************************************************************/
     183              : 
     184        65094 : void push_stack(string tokn)
     185              : {
     186        65094 :     stack<string> *file_stack = NULL;
     187        65094 :     file_stack = gvar->file_stack;
     188        65094 :     string value;
     189              : 
     190        65094 :     if (file_stack) {
     191        65094 :         file_stack->push(tokn);
     192        65094 :     }
     193        65094 : }
     194              : 
     195              : /*************************************************************************************/
     196              : 
     197              : /*************************************************************************************/
     198              : 
     199        65094 : void pop_stack()
     200              : {
     201        65094 :     stack<string> *file_stack = NULL;
     202        65094 :     file_stack = gvar->file_stack;
     203        65094 :     string value;
     204              : 
     205        65094 :     if (file_stack) {
     206        65094 :         file_stack->pop();
     207        65094 :     }
     208        65094 : }
     209              : 
     210              : /*************************************************************************************/
     211              : 
     212              : /*************************************************************************************/
     213              : 
     214       381158 : void perform_stack_operations(string tokn)
     215              : {
     216              : 
     217       381158 :     if (check_tokn_to_add_stack(tokn)) {
     218              : 
     219        97236 :         if (size_stack()) {
     220              : 
     221        95135 :             if (check_matching_bracket(tokn)) {
     222              : 
     223              :                 // pop brackets
     224        32142 :                 pop_stack();
     225              : 
     226        32142 :                 if (!top_is_bracket()) {
     227              : 
     228              :                     //pop keyword
     229        32142 :                     pop_stack();
     230              : 
     231        32142 :                 }
     232              : 
     233        32142 :             } else {
     234              : 
     235        62993 :                 push_stack(tokn);
     236              : 
     237              :             }
     238              : 
     239        95135 :         } else {
     240              : 
     241         2101 :             push_stack(tokn);
     242              :         }
     243              : 
     244        97236 :     }
     245       381158 : }
     246              : 
     247              : /*************************************************************************************/
     248              : 
     249              : /*************************************************************************************/
     250              : 
     251       381158 : void stack_operations(string tokn)
     252              : {
     253       381158 :     perform_stack_operations(tokn);
     254       381158 : }
     255              : 
     256              : /*************************************************************************************/
     257              : 
     258              : /*************************************************************************************/
     259              : 
     260          663 : void debug_stack(string msg)
     261              : {
     262              : 
     263          663 :     cout << msg <<endl;
     264         1473 :     while (size_stack()) {
     265          810 :         cout << " stack: "<<top_stack() << endl;
     266          810 :         pop_stack();
     267              :     }
     268          663 : }
     269              : 
     270              : /*************************************************************************************/
     271              : 
     272              : /*************************************************************************************/
     273              : 
     274       380495 : string get_tokn()
     275              : {
     276       380495 :     string tokn;
     277              : 
     278              :     //tokn = get_token();
     279              :     //stack_operations(tokn);
     280              : 
     281       380495 :     tokn = get_token();
     282       380495 :     stack_operations(tokn);
     283              : 
     284              :     // for comments inline
     285       381158 :     while (tokn.find_first_of("#") != string::npos) {
     286              : 
     287          663 :         go_to_next_line();
     288          663 :         tokn = get_token();
     289          663 :         stack_operations(tokn);
     290              : 
     291              :     }
     292              : 
     293       380495 :     check_def_tokn(tokn);
     294       380495 :     check_use_tokn(tokn);
     295              : 
     296       380495 :     return tokn;
     297       380495 : }
     298              : 
     299              : 
     300              : /*************************************************************************************/
     301              : 
     302              : /*************************************************************************************/
     303              : 
     304              : 
     305              : 
     306            0 : void check_shape(Container *container)
     307              : {
     308            0 :     PointSet *point_set = NULL;
     309            0 :     Coordinate *coordinate = NULL;
     310            0 :     vector<Point *> *coordinate_vec = NULL;
     311            0 :     vector<Point *>::iterator it;
     312            0 :     Point *point = NULL;
     313            0 :     Shape *shape = NULL;
     314              : 
     315            0 :     shape = (Shape *) get_container_data(container);
     316              : 
     317            0 :     if (shape) {
     318              : 
     319            0 :         point_set = shape->point_set;
     320              : 
     321            0 :         if (point_set) {
     322              : 
     323            0 :             coordinate = point_set->coordinate;
     324            0 :             if (coordinate) {
     325              : 
     326            0 :                 coordinate_vec = coordinate->coordinate_vec;
     327            0 :                 if (coordinate_vec) {
     328            0 :                     for (it = coordinate_vec->begin(); it != coordinate_vec->end(); ++it) {
     329            0 :                         point = *it;
     330            0 :                         if (point)
     331            0 :                             cout << "r_shape value: x = " << point->x << " y = " << point->y << " z = "
     332            0 :                                  << point->z << endl;
     333            0 :                     }
     334            0 :                 }
     335            0 :             }
     336            0 :         }
     337            0 :     }
     338            0 : }
     339              : 
     340              : /*************************************************************************************/
     341              : 
     342              : /*************************************************************************************/
     343              : 
     344          151 : void check_read_point_set(void *args)
     345              : {
     346          151 :     Coordinate *coordinate = NULL;
     347          151 :     vector<Point *> *coordinate_vec = NULL;
     348          151 :     vector<Point *>::iterator it;
     349          151 :     Point *point = NULL;
     350          151 :     PointSet *point_set = NULL;
     351              : 
     352          151 :     point_set = (PointSet *)args;
     353              : 
     354          151 :     if (point_set) {
     355              : 
     356          151 :         coordinate = point_set->coordinate;
     357          151 :         if (coordinate) {
     358           96 :             coordinate_vec = coordinate->coordinate_vec;
     359           96 :             if (coordinate_vec) {
     360          419 :                 for (it = coordinate_vec->begin(); it != coordinate_vec->end(); ++it) {
     361          323 :                     point = *it;
     362          323 :                     if (point)
     363          323 :                         cout << "r_point_set value: x = " << point->x << " y = " << point->y << " z = " << point->z << endl;
     364          323 :                 }
     365           96 :             }
     366           96 :         }
     367          151 :     }
     368          151 : }
     369              : 
     370              : 
     371          269 : void check_shape2(void *args)
     372              : {
     373          269 :     PointSet *point_set = NULL;
     374          269 :     Coordinate *coordinate = NULL;
     375          269 :     vector<Point *> *coordinate_vec = NULL;
     376          269 :     vector<Point *>::iterator it;
     377          269 :     Point *point = NULL;
     378          269 :     Shape *shape = NULL;
     379              : 
     380          269 :     shape = (Shape *)args;
     381              : 
     382          269 :     if (shape) {
     383              : 
     384          269 :         point_set = shape->point_set;
     385              : 
     386          269 :         if (point_set) {
     387              : 
     388          112 :             coordinate = point_set->coordinate;
     389          112 :             if (coordinate) {
     390              : 
     391           44 :                 coordinate_vec = coordinate->coordinate_vec;
     392           44 :                 if (coordinate_vec) {
     393          294 :                     for (it = coordinate_vec->begin(); it != coordinate_vec->end(); ++it) {
     394          250 :                         point = *it;
     395          250 :                         if (point)
     396          500 :                             cout << "r_shape value: x = " << point->x << " y = " << point->y << " z = "
     397          250 :                                  << point->z << endl;
     398          250 :                     }
     399           44 :                 }
     400           44 :             }
     401          112 :         }
     402          269 :     }
     403          269 : }
     404              : 
     405          295 : void check_transform2(void *args)
     406              : {
     407              : 
     408              :     int i;
     409              :     DataType type;
     410          295 :     void *data = NULL;
     411              : 
     412          295 :     data = args;
     413              : 
     414              : 
     415              : 
     416          295 :     if (data) {
     417              : 
     418          617 :         while (data != NULL) {
     419              : 
     420          322 :             type = get_node_type(data);
     421              : 
     422          322 :             if (type == SHAPE) {
     423              : 
     424              : 
     425           76 :                 check_shape2(data);
     426           76 :                 data = NULL;
     427              : 
     428          322 :             } else if ( type == TRANSFORM) {
     429              : 
     430           78 :                 Transform *transform = (Transform *)data;
     431              : 
     432          312 :                 for (i = 0; i < 3; i++) {
     433          234 :                     cout << "translation[" << i << "] -> " << transform->translation[i] << endl;
     434          234 :                 }
     435              : 
     436              : 
     437          312 :                 for (i = 0; i < 3; i++) {
     438          234 :                     cout << "scale[" << i << "] -> " << transform->scale[i] << endl;
     439          234 :                 }
     440              : 
     441              : 
     442          390 :                 for (i = 0; i < 4; i++) {
     443          312 :                     cout << "rotation[" << i << "] -> " << transform->rotation[i] << endl;
     444          312 :                 }
     445              : 
     446           78 :                 data = transform->children;
     447              : 
     448           78 :             } else {
     449          168 :                 data = NULL;
     450              :             }
     451              :         }
     452          295 :     }
     453          295 : }
     454              : 
     455              : /*************************************************************************************/
     456              : 
     457              : /*************************************************************************************/
     458              : 
     459          663 : void check_frame(vector<Container *> *frame)
     460              : {
     461          663 :     vector<Container *>::iterator it;
     462          663 :     DataType type = UNKNOWN;
     463              : 
     464              : 
     465         7126 :     for (it = frame->begin(); it != frame->end(); ++it) {
     466              : 
     467         6463 :         type = get_container_type((Container *)*it);
     468              : 
     469         6463 :         if (type == SHAPE) {
     470            0 :             cout << "SHAPE" << endl;
     471            0 :             check_shape(*it);
     472         6463 :         } else if (type == TRANSFORM) {
     473              :             //check_transform(*it);
     474            0 :         }
     475         6463 :     }
     476          663 : }
     477              : 
     478              : 
     479              : /*************************************************************************************/
     480              : 
     481              : /*************************************************************************************/
     482              : 
     483              : 
     484          663 : void debug_def2()
     485              : {
     486          663 :     map<string, void *>::iterator def_map_it;
     487          663 :     map<string, void *> *def_map = NULL;
     488              : 
     489          663 :     def_map = gvar->def_map2;
     490          663 :     int i = 0;
     491              : 
     492          663 :     if (def_map) {
     493              : 
     494         1761 :         for (def_map_it = def_map->begin(); def_map_it != def_map->end(); ++def_map_it) {
     495         1098 :             cout << "def map key: " << def_map_it->first <<"   value: " << def_map_it->second << endl;
     496         1098 :             i++;
     497         1098 :             if (i == 1) {
     498          295 :                 cout << endl << "@@@@@@@@@@   TRANSFORM  @@@@@@@@@@@" << endl;
     499          295 :                check_transform2(def_map_it->second);
     500          295 :             }
     501         1098 :             if (i == 2) {
     502          193 :                 cout << endl << "@@@@@@@@@@   SHAPE  @@@@@@@@@@@" << endl;
     503          193 :                 check_shape2(def_map_it->second);
     504              : 
     505          193 :             }
     506              : 
     507         1098 :             if (i == 3) {
     508          151 :                 cout << endl << "@@@@@@@@@@   POINTSET  @@@@@@@@@@@" << endl;
     509          151 :                 check_read_point_set(def_map_it->second);
     510              : 
     511          151 :             }
     512         1098 :         }
     513          663 :     }
     514          663 : }
     515              : 
     516              : 
     517              : 
     518              : /*************************************************************************************/
     519              : 
     520              : /*************************************************************************************/
     521              : 
     522       152769 : void *call_node_read_function(string tokn, void *args)
     523              : {
     524              : 
     525       152769 :     map<string, DataType> *node_type_map = NULL;
     526       152769 :     map<string, DataType>::iterator node_type_map_it;
     527              : 
     528       152769 :     map<DataType, DataSup *> *type_sup_map = NULL;
     529       152769 :     map<DataType, DataSup *>::iterator type_sup_map_it;
     530              : 
     531       152769 :     void *data = NULL;
     532              : 
     533       152769 :     node_type_map = get_node_type_map();
     534       152769 :     type_sup_map = get_type_sup_map();
     535              : 
     536       152769 :     node_type_map_it = node_type_map->find(tokn);
     537              : 
     538       152769 :     if (node_type_map_it != node_type_map->end()) {
     539              : 
     540        32549 :         type_sup_map_it = type_sup_map->find(node_type_map_it->second);
     541              : 
     542        32549 :         if (type_sup_map_it != type_sup_map->end()) {
     543              : 
     544        24831 :             data = type_sup_map_it->second->read_node_fun(args);
     545        24831 :         }
     546        32549 :     }
     547       152769 :     return data;
     548              : }
     549              : 
     550              : /*************************************************************************************/
     551              : 
     552              : /*************************************************************************************/
     553              : 
     554              : 
     555        15242 : void *call_field_read_function(string tokn, void *args)
     556              : {
     557              : 
     558        15242 :     map<string, DataType> *field_type_map = NULL;
     559        15242 :     map<string, DataType>::iterator field_type_map_it;
     560              : 
     561        15242 :     map<DataType, DataSup *> *type_sup_map = NULL;
     562        15242 :     map<DataType, DataSup *>::iterator type_sup_map_it;
     563              : 
     564        15242 :     void *data = NULL;
     565              : 
     566        15242 :     field_type_map = get_field_type_map();
     567        15242 :     type_sup_map = get_type_sup_map();
     568              : 
     569        15242 :     field_type_map_it = field_type_map->find(tokn);
     570              : 
     571        15242 :     if (field_type_map_it != field_type_map->end()) {
     572              : 
     573         6558 :         type_sup_map_it = type_sup_map->find(field_type_map_it->second);
     574              : 
     575         6558 :         if (type_sup_map_it != type_sup_map->end()) {
     576              : 
     577         6558 :             data = type_sup_map_it->second->read_field_fun(args);
     578         6558 :         }
     579         6558 :     }
     580        15242 :     return data;
     581              : }
     582              : 
     583              : /*************************************************************************************/
     584              : 
     585              : /*************************************************************************************/
     586              : 
     587          663 : void read_vrml(char *filename)
     588              : {
     589          663 :     string tokn;
     590          663 :     ifstream *fp = NULL;
     591              : 
     592          663 :     map<string, DataType> *node_type_map = NULL;
     593              : 
     594          663 :     map<DataType, DataSup *> *type_sup_map = NULL;
     595              : 
     596          663 :     map<string, DataType> *field_type_map = NULL;
     597              : 
     598          663 :     stack<string> *file_stack = NULL;
     599              : 
     600          663 :     vector<Container *> *frame = NULL;
     601              : 
     602          663 :     map<string, Container *> *def = NULL;
     603              : 
     604          663 :     map<string, void *> *def_map2 = NULL;
     605              : 
     606          663 :     void *data = NULL;
     607              : 
     608          663 :     DataType data_type = UNKNOWN;
     609              : 
     610          663 :     init_node_type_map(&node_type_map);
     611          663 :     init_field_type_map(&field_type_map);
     612          663 :     init_type_sup_map(&type_sup_map);
     613          663 :     init_stack(&file_stack);
     614          663 :     init_frame(&frame);
     615          663 :     init_def(&def);
     616          663 :     init_def_map2(&def_map2);
     617              : 
     618          663 :     init_gvar(node_type_map, type_sup_map, field_type_map, file_stack, def, def_map2);
     619              : 
     620          663 :     gvar->frame = frame;
     621              : 
     622          663 :     int i = 0;
     623          663 :     int def_flag = 0;
     624          663 :     string def_tokn;
     625              : 
     626              :     //fp = open_file("/home/alepapadop/VRML/5pointset.wrl");
     627              :     //fp = open_file("/home/alepapadop/VRML/a.wrl");
     628          663 :     fp = open_file(filename);
     629              : 
     630        25097 :     while (fp->good()) {
     631              : 
     632        24566 :         tokn = get_tokn();
     633              : 
     634        24566 :         if (gvar->def_flag) {
     635         1377 :             def_flag = 1;
     636         1377 :             def_tokn = gvar->def_tokn;
     637              :             //gvar->def_flag = 0;
     638              :             //gvar->def_tokn = "";
     639         1377 :         }
     640              : 
     641        24566 :         data = call_node_read_function(tokn, NULL);
     642              : 
     643        24566 :         if (def_flag && data !=NULL) {
     644         3365 :             add_to_def(def_tokn, (Container *)data);
     645         3365 :             add_to_def_map(def_tokn, data);
     646              :             //(*(gvar->def_map2))[def_tokn] = data;
     647         3365 :         }
     648        24566 :         if (data != NULL) {
     649         6463 :             frame->push_back((Container *)data);
     650         6463 :         }
     651        24566 :         data = NULL;
     652              : 
     653              : 
     654              :         // lthos auto, edw einai pou tha mpainei sto file data to frame
     655        24566 :         if (!size_stack()) {
     656         2713 :             init_frame(&frame);
     657         2713 :             gvar->frame = frame;
     658         2713 :         }
     659              : 
     660        24566 :         data_type = UNKNOWN;
     661        24566 :         i ++;
     662        24566 :         if (i == 100) break;
     663              :     }
     664          663 :     check_frame(frame);
     665          663 :     debug_stack("\nSTACK \n\n");
     666              : //    debug_def();
     667          663 :     debug_def2();
     668          663 : }
     669              : 
     670              : 
     671              : 
     672              : 
     673              : 
     674              : 
        

Generated by: LCOV version 2.0-1