Ice Sheet System Model  4.18
Code documentation
Functions
KMLFileReadUtils.cpp File Reference
#include "./KMLFileReadUtils.h"
#include "./KML_Object.h"
#include "../shared/shared.h"

Go to the source code of this file.

Functions

char * KMLFileToken (FILE *fid, int *pncom=NULL, char ***ppcom=NULL)
 
char * KMLFileTokenComment (FILE *fid)
 
void KMLFileTokenBuffer (char **pbuffer, int *pibuf, int *pbuflen, int c, int bufblk)
 
char * KMLFileTagName (char *pname, char *ktag)
 
char * KMLFileTagName (char *pname, int *m, int maxlen, char *ktag)
 
int KMLFileTagAttrib (KML_Object *kobj, char *ktag)
 
int KMLFileTokenParse (int *pival, char *ktag, FILE *fid)
 
int KMLFileTokenParse (bool *pbval, char *ktag, FILE *fid)
 
char * KMLFileTokenParse (char *pstr, char *ktag, FILE *fid)
 
char * KMLFileTokenParse (char *pstr, int *m, int maxlen, char *ktag, FILE *fid)
 
int KMLFileTokenParse (float *pfval, char *ktag, FILE *fid)
 
int KMLFileTokenParse (double *pdval, char *ktag, FILE *fid)
 
int KMLFileTokenParse (double **pdval, int *m, int maxlen, char *ktag, FILE *fid)
 
int KMLFileTokenParse (double **pdval, int *m, int n, int maxlen, char *ktag, FILE *fid)
 
int KMLFileTagSkip (char *ktag, FILE *fid)
 

Function Documentation

◆ KMLFileToken()

char* KMLFileToken ( FILE *  fid,
int *  pncom = NULL,
char ***  ppcom = NULL 
)

Definition at line 18 of file KMLFileReadUtils.cpp.

19  {
20 
21 /* get the next token (tag or field) in the file */
22 
23  bool inew=1,itag=0,ifield=0;
24  int c;
25  int ibuf=0,buflen=1024,bufblk=1024;
26  char *buffer=NULL,*bufferc=NULL,**pcom2=NULL;
27 
28  buffer=xNew<char>(buflen);
29  buffer[0]='\0';
30 
31 /* read kml file character-by-character */
32 
33 // note that fgets includes newline
34 // fgets(buffer,buflen,fid);
35 
36  while ((c=getc(fid)) != EOF) {
37  /* ignore leading blanks */
38  if (inew && isspace(c))
39  continue;
40 
41  /* distinguish between tag or field */
42  if (!itag && !ifield) {
43 
44  /* distinguish between tag or comment */
45  if (c == '<') {
46  ungetc(c,fid);
47  if (!(bufferc=KMLFileTokenComment(fid))) {
48  c=getc(fid);
49  itag=1;
50  }
51  else {
52  if (pncom && ppcom) {
53  (*pncom)++;
54  pcom2=xNew<char*>(*pncom);
55  memcpy(pcom2,*ppcom,(*pncom-1)*sizeof(char*));
56  xDelete<char*>(*ppcom);
57  *ppcom=pcom2;
58  pcom2=NULL;
59 // *ppcom=(char **) xrealloc(*ppcom,*pncom*sizeof(char*));
60  (*ppcom)[*pncom-1]=bufferc;
61  }
62  else
63  xDelete<char>(bufferc);
64  inew=1;
65  continue;
66  }
67  }
68  else
69  ifield=1;
70  inew=0;
71  KMLFileTokenBuffer(&buffer,&ibuf,&buflen,
72  c,
73  bufblk);
74  }
75 
76  /* accumulate tag, not including newlines */
77  else if (itag) {
78  if (c != '\n') {
79  inew=0;
80  KMLFileTokenBuffer(&buffer,&ibuf,&buflen,
81  c,
82  bufblk);
83  if (c == '>')
84  break;
85  }
86  else
87  inew=1;
88  }
89 
90  /* accumulate field, including newlines */
91  else if (ifield) {
92  /* distinguish between another tag or comment */
93  if (c == '<') {
94  ungetc(c,fid);
95  if (!(bufferc=KMLFileTokenComment(fid)))
96  break;
97  else
98  if (pncom && ppcom) {
99  (*pncom)++;
100  pcom2=xNew<char*>(*pncom);
101  memcpy(pcom2,*ppcom,(*pncom-1)*sizeof(char*));
102  xDelete<char*>(*ppcom);
103  *ppcom=pcom2;
104  pcom2=NULL;
105 // *ppcom=(char **) xrealloc(*ppcom,*pncom*sizeof(char*));
106  (*ppcom)[*pncom-1]=bufferc;
107  }
108  else
109  xDelete<char>(bufferc);
110  }
111  else {
112  inew=0;
113  KMLFileTokenBuffer(&buffer,&ibuf,&buflen,
114  c,
115  bufblk);
116  if (c == '\n')
117  inew=1;
118  }
119  }
120 
121  }
122 
123 /* remove trailing blanks or newline */
124 
125  while (ibuf > 0)
126  if (isspace(buffer[ibuf-1]))
127  ibuf--;
128  else {
129  buffer[ibuf]='\0';
130  break;
131  }
132 
133 // if (itag)
134 // _printf0_("tag buffer (length=" << ibuf << "):\n");
135 // else if (ifield)
136 // _printf0_("field buffer (length=" << ibuf << "):\n");
137 // _printf0_(buffer << "\n");
138 
139  if (!ibuf)
140  xDelete<char>(buffer);
141 
142  return(buffer);
143 }

◆ KMLFileTokenComment()

char* KMLFileTokenComment ( FILE *  fid)

Definition at line 145 of file KMLFileReadUtils.cpp.

145  {/*{{{*/
146 
147 /* check for comment in the file and read it */
148 
149  bool inew=1;
150  int i;
151  int c;
152  int ibuf=0,buflen=1024,bufblk=1024;
153  char* buffer=NULL;
154 
155  buffer=xNew<char>(buflen);
156  buffer[0]='\0';
157 
158 /* read kml file character-by-character */
159 
160  while ((c=getc(fid)) != EOF) {
161  /* ignore leading blanks */
162  if (inew && isspace(c))
163  continue;
164 
165  inew=0;
166  KMLFileTokenBuffer(&buffer,&ibuf,&buflen,
167  c,
168  bufblk);
169 
170  /* check for comment */
171  if (ibuf <= 4) {
172  if ((ibuf == 1 && buffer[0] != '<') ||
173  (ibuf == 2 && buffer[1] != '!') ||
174  (ibuf == 3 && buffer[2] != '-') ||
175  (ibuf == 4 && buffer[3] != '-')) {
176  for (i=ibuf-1; i>=0; i--)
177  ungetc(buffer[i],fid);
178  xDelete<char>(buffer);
179  return(buffer);
180  }
181  }
182 
183  /* accumulate comment, including newlines */
184  else
185  if (buffer[ibuf-3]=='-' && buffer[ibuf-2]=='-' && buffer[ibuf-1]=='>')
186  break;
187  }
188 
189 /* remove trailing blanks or newline */
190 
191  while (ibuf > 0)
192  if (isspace(buffer[ibuf-1]))
193  ibuf--;
194  else {
195  buffer[ibuf]='\0';
196  break;
197  }
198 
199 // _printf0_("comment buffer (length=" << ibuf << "):\n");
200 // _printf0_(buffer << "\n");
201 
202  if (!ibuf)
203  xDelete<char>(buffer);
204 
205  return(buffer);
206 }

◆ KMLFileTokenBuffer()

void KMLFileTokenBuffer ( char **  pbuffer,
int *  pibuf,
int *  pbuflen,
int  c,
int  bufblk 
)

Definition at line 208 of file KMLFileReadUtils.cpp.

210  {
211 
212 /* add the specified character to the token buffer */
213 
214  char* buffer2=NULL;
215 
216 /* check buffer length and realloc if necessary */
217 
218  if (*pibuf+2 > *pbuflen) {
219  *pbuflen+=bufblk;
220  buffer2=xNew<char>(*pbuflen);
221  memcpy(buffer2,*pbuffer,(*pbuflen-bufblk)*sizeof(char));
222  xDelete<char>(*pbuffer);
223  *pbuffer=buffer2;
224  buffer2=NULL;
225 // *pbuffer=(char *) xrealloc(*pbuffer,*pbuflen*sizeof(char));
226  }
227 
228 /* add character and terminator */
229 
230  (*pbuffer)[(*pibuf)++]=c;
231  (*pbuffer)[ *pibuf ]='\0';
232 
233  return;
234 }

◆ KMLFileTagName() [1/2]

char* KMLFileTagName ( char *  pname,
char *  ktag 
)

Definition at line 236 of file KMLFileReadUtils.cpp.

237  {
238 
239  return(KMLFileTagName(pname,NULL,0,
240  ktag));
241 }

◆ KMLFileTagName() [2/2]

char* KMLFileTagName ( char *  pname,
int *  m,
int  maxlen,
char *  ktag 
)

Definition at line 243 of file KMLFileReadUtils.cpp.

244  {
245 
246 /* for the given tag buffer, read and store the name */
247 
248  char* ktagi;
249  char* ktokn;
250 
251  if (strncmp(&ktag[0],"<" ,1) || strncmp(&ktag[strlen(ktag)-1],">",1))
252  _error_("KMLFileTagName -- Missing tag delimiters in " << ktag << ".\n");
253 
254 /* strtok modifies ktag, so work on copy */
255 
256  ktagi=xNew<char>(strlen(ktag)+1);
257  memcpy(ktagi,ktag,(strlen(ktag)+1)*sizeof(char));
258 
259 /* skip opening delimeter and find subsequent blank or closing delimiter */
260 
261  ktokn=strtok(ktagi,"< >");
262 // _printf0_("KMLFileTagName -- initial token=\"" << ktokn << "\".\n");
263 
264  if (!pname) {
265  if (maxlen)
266  pname=xNew<char>(maxlen +1);
267  else
268  pname=xNew<char>(strlen(ktokn)+1);
269  }
270 
271  if (maxlen && (maxlen < strlen(ktokn))) {
272  _printf0_("KMLFileTagName -- string field too short for " << ktag << ".\n");
273  _printf0_("KMLFileTagName -- \"" << ktokn << "\" truncated to " << maxlen << " characters.\n");
274  strncpy(pname,ktokn,maxlen);
275  }
276  else
277  memcpy(pname,ktokn,(strlen(ktokn)+1)*sizeof(char));
278 
279  xDelete<char>(ktagi);
280 
281  if (m)
282  *m=strlen(pname);
283 
284  return(pname);
285 }

◆ KMLFileTagAttrib()

int KMLFileTagAttrib ( KML_Object kobj,
char *  ktag 
)

Definition at line 287 of file KMLFileReadUtils.cpp.

288  {
289 
290 /* for the given tag buffer, read and store the attributes */
291 
292  char* ktagi;
293  char* ktokn;
294  char* ktokv;
295  char quote[]={'\"','\0'};
296  int isolo=0;
297 
298 /* strtok modifies ktag, so work on copy */
299 
300  ktagi=xNew<char>(strlen(ktag)+1);
301  memcpy(ktagi,ktag,(strlen(ktag)+1)*sizeof(char));
302 
303 /* loop through tag to find all attributes */
304 
305  /* return first non blank and move past subsequent blank */
306  ktokn=strtok(ktagi," ");
307 // _printf0_("KMLFileTagAttrib -- initial token=\"" << ktokn << "\".\n");
308 
309  /* return next non " =?/>" and move past subsequent " =?/>" */
310  while((ktokn=strtok(NULL," =?/>"))){
311 
312  /* return next non quote and move past subsequent quote */
313  ktokv=strtok(NULL,quote);
314 // _printf0_("KMLFileTagAttrib -- attribute " << ktokn << "=\"" << ktokv << "\".\n");
315 
316 /* add the attribute to the dataset */
317 
318  if (kobj)
319  kobj->AddAttrib(ktokn,ktokv);
320  }
321 
322  xDelete<char>(ktagi);
323 
324 /* check for xml declaration, dtd declaration, or solo tag */
325 
326  if ((!strncmp(&ktag[0],"<?" ,2) && !strncmp(&ktag[strlen(ktag)-2],"?>",2)) ||
327  (!strncmp(&ktag[0],"<!DOCTYPE",9) && !strncmp(&ktag[strlen(ktag)-1], ">",1)) ||
328  (!strncmp(&ktag[0],"<" ,1) && !strncmp(&ktag[strlen(ktag)-2],"/>",2)))
329  isolo=1;
330 // _printf0_("KMLFileTagAttrib -- isolo=" << isolo << ".\n");
331 
332  return(isolo);
333 }

◆ KMLFileTokenParse() [1/8]

int KMLFileTokenParse ( int *  pival,
char *  ktag,
FILE *  fid 
)

Definition at line 335 of file KMLFileReadUtils.cpp.

337  {
338 
339  char* kstr;
340 
341 /* get next token and convert to appropriate format */
342 
343  if (!(kstr=KMLFileToken(fid,
344  NULL,NULL)) ||
345  (kstr[0] == '<'))
346  _error_("KMLFileTokenParse -- Missing integer field for " << ktag << ".\n");
347 
348  sscanf(kstr,"%d",pival);
349  xDelete<char>(kstr);
350 
351 /* get additional token and compare to closing tag */
352 
353  if(ktag){
354  if (!(kstr=KMLFileToken(fid,
355  NULL,NULL)) ||
356  (kstr[0] != '<') ||
357  (kstr[1] != '/') ||
358  (strncmp(&(kstr[2]),&(ktag[1]),strlen(ktag)-1)))
359  {_error_("KMLFileTokenParse -- Missing closing tag for " << ktag << ".\n");}
360  else{
361  xDelete<char>(kstr);
362  }
363  }
364 
365 // _printf0_("KMLFileTokenParse -- " << ktag << "=" << *pival << ".\n");
366 
367  return(0);
368 }

◆ KMLFileTokenParse() [2/8]

int KMLFileTokenParse ( bool *  pbval,
char *  ktag,
FILE *  fid 
)

Definition at line 370 of file KMLFileReadUtils.cpp.

370  {/*{{{*/
371 
372  int ival;
373  char* kstr;
374 
375 /* get next token and convert to appropriate format */
376 
377  if (!(kstr=KMLFileToken(fid,
378  NULL,NULL)) ||
379  (kstr[0] == '<'))
380  {_error_("KMLFileTokenParse -- Missing bool field for " << ktag << ".\n");}
381 
382  sscanf(kstr,"%d",&ival);
383  *pbval=(bool)ival;
384  xDelete<char>(kstr);
385 
386 /* get additional token and compare to closing tag */
387 
388  if(ktag){
389  if (!(kstr=KMLFileToken(fid,
390  NULL,NULL)) ||
391  (kstr[0] != '<') ||
392  (kstr[1] != '/') ||
393  (strncmp(&(kstr[2]),&(ktag[1]),strlen(ktag)-1)))
394  {_error_("KMLFileTokenParse -- Missing closing tag for " << ktag << ".\n");}
395  else
396  xDelete<char>(kstr);
397  }
398 
399 // _printf0_("KMLFileTokenParse -- " << ktag << "=" << (*pbval ? "true" : "false") << ".\n");
400 
401  return(0);
402 }

◆ KMLFileTokenParse() [3/8]

char* KMLFileTokenParse ( char *  pstr,
char *  ktag,
FILE *  fid 
)

Definition at line 404 of file KMLFileReadUtils.cpp.

406  {
407 
408  return(KMLFileTokenParse(pstr,NULL,0,
409  ktag,
410  fid));
411 }

◆ KMLFileTokenParse() [4/8]

char* KMLFileTokenParse ( char *  pstr,
int *  m,
int  maxlen,
char *  ktag,
FILE *  fid 
)

Definition at line 413 of file KMLFileReadUtils.cpp.

415  {
416 
417  char* kstr;
418 
419 /* get next token and allocate if necessary */
420 
421  if (!(kstr=KMLFileToken(fid,
422  NULL,NULL)) ||
423  (kstr[0] == '<'))
424  _error_("KMLFileTokenParse -- Missing string field for " << ktag << ".\n");
425 
426  if (!pstr) {
427  if (maxlen)
428  pstr=xNew<char>(maxlen +1);
429  else
430  pstr=xNew<char>(strlen(kstr)+1);
431  }
432 
433  if (maxlen && (maxlen < strlen(kstr))) {
434  _printf0_("KMLFileTokenParse -- string field too short for " << ktag << ".\n");
435  _printf0_("KMLFileTokenParse -- \"" << kstr << "\" truncated to " << maxlen << " characters.\n");
436  strncpy(pstr,kstr,maxlen);
437  }
438  else
439  memcpy(pstr,kstr,(strlen(kstr)+1)*sizeof(char));
440 
441  xDelete<char>(kstr);
442 
443  if (m)
444  *m=strlen(pstr);
445 
446 /* get additional token and compare to closing tag */
447 
448  if(ktag){
449  if (!(kstr=KMLFileToken(fid,
450  NULL,NULL)) ||
451  (kstr[0] != '<') ||
452  (kstr[1] != '/') ||
453  (strncmp(&(kstr[2]),&(ktag[1]),strlen(ktag)-1)))
454  {_error_("KMLFileTokenParse -- Missing closing tag for " << ktag << ".\n");}
455  else
456  xDelete<char>(kstr);
457  }
458 
459 // _printf0_("KMLFileTokenParse -- " << ktag << "=\"" << pstr << "\".\n");
460 
461  return(pstr);
462 }

◆ KMLFileTokenParse() [5/8]

int KMLFileTokenParse ( float *  pfval,
char *  ktag,
FILE *  fid 
)

Definition at line 464 of file KMLFileReadUtils.cpp.

466  {
467 
468  char* kstr;
469 
470 /* get next token and convert to appropriate format */
471 
472  if (!(kstr=KMLFileToken(fid,
473  NULL,NULL)) ||
474  (kstr[0] == '<'))
475  {_error_("KMLFileTokenParse -- Missing integer field for " << ktag << ".\n");}
476 
477  sscanf(kstr,"%g",pfval);
478  xDelete<char>(kstr);
479 
480 /* get additional token and compare to closing tag */
481 
482  if(ktag){
483  if (!(kstr=KMLFileToken(fid,
484  NULL,NULL)) ||
485  (kstr[0] != '<') ||
486  (kstr[1] != '/') ||
487  (strncmp(&(kstr[2]),&(ktag[1]),strlen(ktag)-1)))
488  {_error_("KMLFileTokenParse -- Missing closing tag for " << ktag << ".\n");}
489  else
490  xDelete<char>(kstr);
491  }
492 
493 // _printf0_("KMLFileTokenParse -- " << ktag << "=" << *pfval << ".\n");
494 
495  return(0);
496 }

◆ KMLFileTokenParse() [6/8]

int KMLFileTokenParse ( double *  pdval,
char *  ktag,
FILE *  fid 
)

Definition at line 498 of file KMLFileReadUtils.cpp.

500  {
501 
502  char* kstr;
503 
504 /* get next token and convert to appropriate format */
505 
506  if (!(kstr=KMLFileToken(fid,
507  NULL,NULL)) ||
508  (kstr[0] == '<'))
509  _error_("KMLFileTokenParse -- Missing integer field for " << ktag << ".\n");
510 
511  sscanf(kstr,"%lg",pdval);
512  xDelete<char>(kstr);
513 
514 /* get additional token and compare to closing tag */
515 
516  if(ktag){
517  if (!(kstr=KMLFileToken(fid,
518  NULL,NULL)) ||
519  (kstr[0] != '<') ||
520  (kstr[1] != '/') ||
521  (strncmp(&(kstr[2]),&(ktag[1]),strlen(ktag)-1)))
522  {_error_("KMLFileTokenParse -- Missing closing tag for " << ktag << ".\n");}
523  else
524  xDelete<char>(kstr);
525  }
526 
527 // _printf0_("KMLFileTokenParse -- " << ktag << "=" << *pdval << ".\n");
528 
529  return(0);
530 }

◆ KMLFileTokenParse() [7/8]

int KMLFileTokenParse ( double **  pdval,
int *  m,
int  maxlen,
char *  ktag,
FILE *  fid 
)

Definition at line 532 of file KMLFileReadUtils.cpp.

534  {
535 
536  int i=-1;
537  char* kstr;
538  char* ktok;
539  double* dval2=NULL;
540  char delim[]={' ',',','\f','\n','\r','\t','\v','\0'};
541 
542 /* get next token and allocate if necessary */
543 
544  if (!(kstr=KMLFileToken(fid,
545  NULL,NULL)) ||
546  (kstr[0] == '<'))
547  _error_("KMLFileTokenParse -- Missing double [m] field for " << ktag << ".\n");
548 
549  if(!*pdval){
550  if (maxlen)
551  *pdval=xNew<IssmPDouble>(maxlen );
552  else
553  *pdval=xNew<IssmPDouble>((strlen(kstr)+1)/2);
554  }
555 
556 /* loop through string to get all values */
557 
558  ktok=strtok(kstr,delim);
559  while (ktok) {
560  i++;
561  if (maxlen && (maxlen < i+1))
562  _error_("KMLFileTokenParse -- Double [m] field too short for " << ktag << ".\n");
563  sscanf(ktok,"%lg",&((*pdval)[i]));
564  ktok=strtok(NULL,delim);
565  }
566  xDelete<char>(kstr);
567 
568  if (!maxlen)
569  dval2=xNew<double>(i+1);
570  memcpy(dval2,*pdval,(i+1)*sizeof(double));
571  xDelete<double>(*pdval);
572  *pdval=dval2;
573  dval2=NULL;
574 // *pdval=(double *) xrealloc(*pdval,(i+1)*sizeof(double));
575 
576  if (m)
577  *m=i+1;
578 
579 /* get additional token and compare to closing tag */
580 
581  if(ktag){
582  if (!(kstr=KMLFileToken(fid,
583  NULL,NULL)) ||
584  (kstr[0] != '<') ||
585  (kstr[1] != '/') ||
586  (strncmp(&(kstr[2]),&(ktag[1]),strlen(ktag)-1)))
587  {_error_("KMLFileTokenParse -- Missing closing tag for " << ktag << ".\n");}
588  else
589  xDelete<char>(kstr);
590  }
591 
592 // _printf0_("KMLFileTokenParse -- " << ktag << "=...\n");
593 // for (j=0; j<=i; j++)
594 // _printf0_(" [" << j << "]: " << (*pdval)[j] << "g\n");
595 
596  return(0);
597 }

◆ KMLFileTokenParse() [8/8]

int KMLFileTokenParse ( double **  pdval,
int *  m,
int  n,
int  maxlen,
char *  ktag,
FILE *  fid 
)

Definition at line 599 of file KMLFileReadUtils.cpp.

601  {
602 
603  int i=-1,j=-1;
604  char* kstr;
605  char* ktok;
606  double* dval2=NULL;
607  char delim[]={' ',',','\f','\n','\r','\t','\v','\0'};
608 
609 /* get next token and allocate if necessary */
610 
611  if (!(kstr=KMLFileToken(fid,
612  NULL,NULL)) ||
613  (kstr[0] == '<'))
614  _error_("KMLFileTokenParse -- Missing double [m x n] field for " << ktag << ".\n");
615 
616  if(!*pdval){
617  if (maxlen)
618  *pdval=xNew<IssmPDouble>(maxlen*n );
619  else
620  *pdval=xNew<IssmPDouble>((strlen(kstr)+1)/2);
621  }
622 
623 /* loop through string to get all values */
624 
625  ktok=strtok(kstr,delim);
626  while (ktok) {
627  i++;
628  if (maxlen && (maxlen*n < i+1))
629  _error_("KMLFileTokenParse -- Double [m x n] field too short for " << ktag << ".\n");
630  j=(j+1) % n;
631  sscanf(ktok,"%lg",&((*pdval)[i]));
632  ktok=strtok(NULL,delim);
633  }
634  xDelete<char>(kstr);
635 
636  if (!maxlen)
637  dval2=xNew<double>((i+1)*n);
638  memcpy(dval2,*pdval,((i+1)*n)*sizeof(double));
639  xDelete<double>(*pdval);
640  *pdval=dval2;
641  dval2=NULL;
642 // *pdval=(double *) xrealloc(*pdval,((i+1)*n)*sizeof(double));
643 
644  if (m)
645  *m=((i+1)+(n-1))/n;
646 
647  if ((i+1) % n)
648  _printf0_("KMLFileTokenParse -- Double [m x n] field for " << ktag << " does not have multiple of n values.\n");
649 
650 /* get additional token and compare to closing tag */
651 
652  if(ktag){
653  if (!(kstr=KMLFileToken(fid,
654  NULL,NULL)) ||
655  (kstr[0] != '<') ||
656  (kstr[1] != '/') ||
657  (strncmp(&(kstr[2]),&(ktag[1]),strlen(ktag)-1)))
658  {_error_("KMLFileTokenParse -- Missing closing tag for " << ktag << ".\n");}
659  else
660  xDelete<char>(kstr);
661  }
662 
663 // _printf0_("KMLFileTokenParse -- " << ktag << "=...\n");
664 // for (j=0; j<=i; j++)
665 // _printf0_(" [" << j << "]: " << (*pdval)[j] << "g\n");
666 
667  return(0);
668 }

◆ KMLFileTagSkip()

int KMLFileTagSkip ( char *  ktag,
FILE *  fid 
)

Definition at line 670 of file KMLFileReadUtils.cpp.

670  {/*{{{*/
671 
672  char* kstr;
673 
674 /* note that tags of the same type can be nested inside each other, so for each
675  opening tag, must find corresponding closing tag */
676 
677  _printf0_("KMLFileTagSkip -- input tag " << ktag << ".\n");
678 
679 /* if next token is a closing tag, compare to input */
680 
681  while((kstr=KMLFileToken(fid,NULL,NULL))){
682  if((kstr[0] == '<') && (kstr[1] == '/') && (!strncmp(&(kstr[2]),&(ktag[1]),(strcspn(ktag," >")-1)/sizeof(char)))){
683  _printf0_("KMLFileTagSkip -- closing tag " << kstr << ".\n");
684  xDelete<char>(kstr);
685  return(0);
686  }
687 
688 /* if next token is an opening tag, call recursively */
689 
690  else if ((kstr[0] == '<') &&
691  (kstr[1] != '/')) {
692  _printf0_("KMLFileTagSkip -- opening tag " << kstr << ".\n");
693  KMLFileTagSkip(kstr,
694  fid);
695  }
696 
697 /* if next token is a closing tag, error out */
698 
699  else if ((kstr[0] == '<') &&
700  (kstr[1] == '/')) {
701  _error_("KMLFileTagSkip -- Unexpected closing tag " << kstr << ".\n");
702  }
703 
704  xDelete<char>(kstr);
705  }
706 
707  _error_("KMLFileTokenParse -- Corresponding closing tag for " << ktag << " not found.\n");
708 
709  return(0);
710 }
_printf0_
#define _printf0_(StreamArgs)
Definition: Print.h:29
KMLFileTagName
char * KMLFileTagName(char *pname, char *ktag)
Definition: KMLFileReadUtils.cpp:236
KMLFileToken
char * KMLFileToken(FILE *fid, int *pncom=NULL, char ***ppcom=NULL)
Definition: KMLFileReadUtils.cpp:18
KMLFileTagSkip
int KMLFileTagSkip(char *ktag, FILE *fid)
Definition: KMLFileReadUtils.cpp:670
KMLFileTokenParse
int KMLFileTokenParse(int *pival, char *ktag, FILE *fid)
Definition: KMLFileReadUtils.cpp:335
KML_Object::AddAttrib
virtual void AddAttrib(const char *name, const char *value)
Definition: KML_Object.cpp:277
KMLFileTokenComment
char * KMLFileTokenComment(FILE *fid)
Definition: KMLFileReadUtils.cpp:145
_error_
#define _error_(StreamArgs)
Definition: exceptions.h:49
KMLFileTokenBuffer
void KMLFileTokenBuffer(char **pbuffer, int *pibuf, int *pbuflen, int c, int bufblk)
Definition: KMLFileReadUtils.cpp:208