Changeset 11319


Ignore:
Timestamp:
02/03/12 15:48:33 (13 years ago)
Author:
jschierm
Message:

KML: Implemented KML_Unknown class to digest and regurgitate unknown KML elements.

Location:
issm/trunk-jpl/src/c/objects/KML
Files:
14 edited

Legend:

Unmodified
Added
Removed
  • TabularUnified issm/trunk-jpl/src/c/objects/KML/KMLFileReadUtils.cpp

    r10840 r11319  
    229229/*}}}*/
    230230
     231/*FUNCTION  KMLFileTagName {{{1*/
     232char* KMLFileTagName(char* pname,
     233                                         char* ktag){
     234
     235        return(KMLFileTagName(pname,NULL,0,
     236                                                  ktag));
     237}
     238/*}}}*/
     239
     240/*FUNCTION  KMLFileTagName {{{1*/
     241char* KMLFileTagName(char* pname,int *m,int maxlen,
     242                                         char* ktag){
     243
     244/*  for the given tag buffer, read and store the name  */
     245
     246        char*   ktagi;
     247        char*   ktokn;
     248
     249        if (strncmp(&ktag[0],"<"        ,1) || strncmp(&ktag[strlen(ktag)-1],">",1))
     250                _error_("KMLFileTagName -- Missing tag delimiters in %s.\n",ktag);
     251
     252/*  strtok modifies ktag, so work on copy  */
     253
     254        ktagi=(char *) xmalloc((strlen(ktag)+1)*sizeof(char));
     255        memcpy(ktagi,ktag,(strlen(ktag)+1)*sizeof(char));
     256
     257/*  skip opening delimeter and find subsequent blank or closing delimiter  */
     258
     259        ktokn=strtok(ktagi,"< >");
     260//      _printf_(true,"KMLFileTagName -- initial token=\"%s\".\n",ktokn);
     261
     262        if (!pname) {
     263                if (maxlen)
     264                        pname=(char *) xmalloc((maxlen       +1)*sizeof(char));
     265                else
     266                        pname=(char *) xmalloc((strlen(ktokn)+1)*sizeof(char));
     267        }
     268
     269        if (maxlen && (maxlen < strlen(ktokn))) {
     270                _printf_(true,"KMLFileTagName -- string field too short for %s.\n",ktag);
     271                _printf_(true,"KMLFileTagName -- \"%s\" truncated to %d characters.\n",ktokn,maxlen);
     272                strncpy(pname,ktokn,maxlen);
     273        }
     274        else
     275                memcpy(pname,ktokn,(strlen(ktokn)+1)*sizeof(char));
     276
     277        xfree((void**)&ktagi);
     278
     279        if (m)
     280                *m=strlen(pname);
     281
     282        return(pname);
     283}
     284/*}}}*/
     285
    231286/*FUNCTION  KMLFileTagAttrib {{{1*/
    232287int KMLFileTagAttrib(KML_Object* kobj,
     
    352407
    353408/*FUNCTION  KMLFileTokenParse {{{1*/
     409char* KMLFileTokenParse(char* pstr,
     410                                                char* ktag,
     411                                                FILE* fid){
     412
     413        return(KMLFileTokenParse(pstr,NULL,0,
     414                                                         ktag,
     415                                                         fid));
     416}
     417/*}}}*/
     418
     419/*FUNCTION  KMLFileTokenParse {{{1*/
    354420char* KMLFileTokenParse(char* pstr,int *m,int maxlen,
    355421                                                char* ktag,
     
    357423
    358424        char*   kstr;
    359         char*   pstro=NULL;
    360425
    361426/*  get next token and allocate if necessary  */
     
    371436                else
    372437                        pstr=(char *) xmalloc((strlen(kstr)+1)*sizeof(char));
    373                 pstro=pstr;
    374438        }
    375439
     
    401465//      _printf_(true,"KMLFileTokenParse -- %s=\"%s\".\n",ktag,pstr);
    402466
    403         return(pstro);
     467        return(pstr);
    404468}
    405469/*}}}*/
  • TabularUnified issm/trunk-jpl/src/c/objects/KML/KMLFileReadUtils.h

    r10840 r11319  
    2121                                                int c,
    2222                                                int bufblk);
     23char* KMLFileTagName(char* pname,
     24                                         char* ktag);
     25char* KMLFileTagName(char* pname,int *m,int maxlen,
     26                                         char* ktag);
    2327int KMLFileTagAttrib(KML_Object* kobj,
    2428                                         char* ktag);
     
    2933                                          char* ktag,
    3034                                          FILE* fid);
     35char* KMLFileTokenParse(char* pstr,
     36                                                char* ktag,
     37                                                FILE* fid);
    3138char* KMLFileTokenParse(char* pstr,int *m,int maxlen,
    32                                           char* ktag,
    33                                           FILE* fid);
     39                                                char* ktag,
     40                                                FILE* fid);
    3441int KMLFileTokenParse(float* pfval,
    3542                                          char* ktag,
  • TabularUnified issm/trunk-jpl/src/c/objects/KML/KML_Container.cpp

    r11202 r11319  
    7474
    7575        memcpy(indent2,indent,(strlen(indent)+1)*sizeof(char));
    76 
    7776        strcat(indent2,"  ");
    7877
  • TabularUnified issm/trunk-jpl/src/c/objects/KML/KML_Feature.cpp

    r11202 r11319  
    9696
    9797        memcpy(indent2,indent,(strlen(indent)+1)*sizeof(char));
    98 
    9998        strcat(indent2,"  ");
    10099
  • TabularUnified issm/trunk-jpl/src/c/objects/KML/KML_File.cpp

    r11202 r11319  
    7676
    7777        memcpy(indent2,indent,(strlen(indent)+1)*sizeof(char));
    78 
    7978        strcat(indent2,"  ");
    8079
  • TabularUnified issm/trunk-jpl/src/c/objects/KML/KML_GroundOverlay.cpp

    r11202 r11319  
    8080
    8181        memcpy(indent2,indent,(strlen(indent)+1)*sizeof(char));
    82 
    8382        strcat(indent2,"  ");
    8483
  • TabularUnified issm/trunk-jpl/src/c/objects/KML/KML_MultiGeometry.cpp

    r11202 r11319  
    7878
    7979        memcpy(indent2,indent,(strlen(indent)+1)*sizeof(char));
    80 
    8180        strcat(indent2,"  ");
    8281
  • TabularUnified issm/trunk-jpl/src/c/objects/KML/KML_Object.cpp

    r11202 r11319  
    2626        attrib    =new DataSet;
    2727        commnt    =new DataSet;
     28        unknwn    =new DataSet;
    2829
    2930}
     
    4041                commnt    =NULL;
    4142        }
     43        if (unknwn) {
     44                delete unknwn;
     45                unknwn    =NULL;
     46        }
    4247
    4348}
     
    5257        _printf_(flag,"        attrib: (size=%d)\n" ,attrib->Size());
    5358        _printf_(flag,"        commnt: (size=%d)\n" ,commnt->Size());
     59        _printf_(flag,"        unknwn: (size=%d)\n" ,unknwn->Size());
    5460
    5561        return;
     
    9096                _printf_(flag,"%s        commnt: [empty]\n"    ,indent);
    9197
     98/*  loop over the unknown objects for the object  */
     99
     100        if (unknwn->Size())
     101                for (i=0; i<unknwn->Size(); i++) {
     102                        ((KML_Unknown *)unknwn->GetObjectByOffset(i))->DeepEcho(indent);
     103                }
     104        else
     105                _printf_(flag,"%s        unknwn: [empty]\n"    ,indent);
     106
    92107        return;
    93108}
     
    96111void  KML_Object::Write(FILE* filout,const char* indent){
    97112
     113        int   i;
     114        char  indent2[81];
     115
    98116//  attributes always written in keyword line of derived classes
    99117//  comments always written after keyword line of derived classes
    100118
    101         ;
     119/*  loop over the unknown objects for the object  */
     120
     121        memcpy(indent2,indent,(strlen(indent)+1)*sizeof(char));
     122        strcat(indent2,"  ");
     123
     124        if (unknwn->Size())
     125                for (i=0; i<unknwn->Size(); i++) {
     126                        ((KML_Unknown *)unknwn->GetObjectByOffset(i))->Write(filout,indent2);
     127                }
    102128
    103129        return;
     
    106132/*FUNCTION KML_Object::Read {{{1*/
    107133void  KML_Object::Read(FILE* fid,char* kstr){
     134
     135        KML_Object*  kobj;
    108136
    109137/*  process field within opening and closing tags  */
     
    118146        else if (!strncmp(kstr,"<",1)) {
    119147                _printf_(true,"KML_Object::Read -- Unrecognized opening tag %s.\n",kstr);
    120                 KMLFileTagSkip(kstr,
    121                                            fid);
     148//              KMLFileTagSkip(kstr,
     149//                                         fid);
     150                kobj=(KML_Object*)new KML_Unknown();
     151                kobj->Read(fid,kstr);
     152                unknwn    ->AddObject((Object*)kobj);
    122153        }
    123154
  • TabularUnified issm/trunk-jpl/src/c/objects/KML/KML_Object.h

    r11202 r11319  
    2121                DataSet* attrib;
    2222                DataSet* commnt;
     23                DataSet* unknwn;
    2324
    2425                /*KML_Object constructors, destructors {{{1*/
  • TabularUnified issm/trunk-jpl/src/c/objects/KML/KML_Overlay.cpp

    r11202 r11319  
    7979
    8080        memcpy(indent2,indent,(strlen(indent)+1)*sizeof(char));
    81 
    8281        strcat(indent2,"  ");
    8382
  • TabularUnified issm/trunk-jpl/src/c/objects/KML/KML_Placemark.cpp

    r11202 r11319  
    7676
    7777        memcpy(indent2,indent,(strlen(indent)+1)*sizeof(char));
    78 
    7978        strcat(indent2,"  ");
    8079
  • TabularUnified issm/trunk-jpl/src/c/objects/KML/KML_Polygon.cpp

    r11202 r11319  
    9292
    9393        memcpy(indent2,indent,(strlen(indent)+1)*sizeof(char));
    94 
    9594        strcat(indent2,"  ");
    9695
     
    134133
    135134        memcpy(indent4,indent,(strlen(indent)+1)*sizeof(char));
    136 
    137135        strcat(indent4,"    ");
    138136
  • TabularUnified issm/trunk-jpl/src/c/objects/KML/KML_Style.cpp

    r11202 r11319  
    109109
    110110        memcpy(indent2,indent,(strlen(indent)+1)*sizeof(char));
    111 
    112111        strcat(indent2,"  ");
    113112
  • TabularUnified issm/trunk-jpl/src/c/objects/KML/KML_Unknown.cpp

    r11295 r11319  
    8080void  KML_Unknown::Write(FILE* filout,const char* indent){
    8181
     82        char  indent2[81];
     83
    8284        fprintf(filout,"%s<%s",indent,name);
    8385        WriteAttrib(filout," ");
     
    8587        WriteCommnt(filout,indent);
    8688
    87         KML_Object::Write(filout,indent);
    88 
    8989        if (value     )
    9090                fprintf(filout,"%s  %s\n",indent,value);
     91
     92        memcpy(indent2,indent,(strlen(indent)+1)*sizeof(char));
     93        strcat(indent2,"  ");
     94
     95        KML_Object::Write(filout,indent2);
    9196
    9297        fprintf(filout,"%s</%s>\n",indent,name);
     
    102107        char**       pcom=NULL;
    103108
     109/*  get object name  */
     110
     111        name=KMLFileTagName(NULL,
     112                                                kstr);
     113//      _printf_(true,"KML_Unknown::Read -- opening name=%s.\n",name);
     114
    104115/*  get object attributes and check for solo tag  */
    105116
     
    112123        while (kstri=KMLFileToken(fid,
    113124                                                          &ncom,&pcom)) {
     125//              _printf_(true,"KML_Unknown::Read -- kstri=%s.\n",kstri);
    114126                if      (!strncmp(&kstri[0],"</", 2) &&
    115127                                 !strncmp(&kstri[2],name,strlen(name))) {
     128//                      _printf_(true,"KML_Unknown::Read -- closing name=%s.\n",name);
    116129                        xfree((void**)&kstri);
    117130                        break;
     
    120133                        _error_("KML_Unknown::Read -- Unexpected closing tag %s.\n",kstri);
    121134
    122                 else if (strncmp(kstri,"<",1))
    123                         KMLFileTokenParse( value     ,NULL,0,
    124                                                           NULL,
    125                                                           fid);
     135                else if (strncmp(kstri,"<",1)) {
     136                        value=(char *) xmalloc((strlen(kstri)+1)*sizeof(char));
     137                        memcpy(value,kstri,(strlen(kstri)+1)*sizeof(char));
     138                }
    126139
    127140                else if (!strncmp(kstri,"<",1))
Note: See TracChangeset for help on using the changeset viewer.