OGRErr OGR_SRSNode::importFromWkt( char ** ppszInput, int nRecLevel, int* pnNodes ) { const char *pszInput = *ppszInput; int bInQuotedString = FALSE; /* Sanity checks */ if( nRecLevel == 10 ) { return OGRERR_CORRUPT_DATA; } if( *pnNodes == 1000 ) { return OGRERR_CORRUPT_DATA; } /* -------------------------------------------------------------------- */ /* Clear any existing children of this node. */ /* -------------------------------------------------------------------- */ ClearChildren(); /* -------------------------------------------------------------------- */ /* Read the ``value'' for this node. */ /* -------------------------------------------------------------------- */ char szToken[512]; int nTokenLen = 0; while( *pszInput != '\0' && nTokenLen < (int) sizeof(szToken)-1 ) { if( *pszInput == '"' ) { bInQuotedString = !bInQuotedString; } else if( !bInQuotedString && (*pszInput == '[' || *pszInput == ']' || *pszInput == ',' || *pszInput == '(' || *pszInput == ')' ) ) { break; } else if( !bInQuotedString && (*pszInput == ' ' || *pszInput == '\t' || *pszInput == 10 || *pszInput == 13) ) { /* just skip over whitespace */ } else { szToken[nTokenLen++] = *pszInput; } pszInput++; } if( *pszInput == '\0' || nTokenLen == sizeof(szToken) - 1 ) return OGRERR_CORRUPT_DATA; szToken[nTokenLen++] = '\0'; SetValue( szToken ); /* -------------------------------------------------------------------- */ /* Read children, if we have a sublist. */ /* -------------------------------------------------------------------- */ if( *pszInput == '[' || *pszInput == '(' ) { do { OGR_SRSNode *poNewChild; OGRErr eErr; pszInput++; // Skip bracket or comma. poNewChild = new OGR_SRSNode(); (*pnNodes) ++; eErr = poNewChild->importFromWkt( (char **) &pszInput, nRecLevel + 1, pnNodes ); if( eErr != OGRERR_NONE ) { delete poNewChild; return eErr; } AddChild( poNewChild ); // swallow whitespace while( isspace(*pszInput) ) pszInput++; } while( *pszInput == ',' ); if( *pszInput != ')' && *pszInput != ']' ) return OGRERR_CORRUPT_DATA; pszInput++; } *ppszInput = (char *) pszInput; return OGRERR_NONE; }
OGRErr OGR_SRSNode::importFromWkt( char ** ppszInput ) { const char *pszInput = *ppszInput; int bInQuotedString = FALSE; /* -------------------------------------------------------------------- */ /* Clear any existing children of this node. */ /* -------------------------------------------------------------------- */ ClearChildren(); /* -------------------------------------------------------------------- */ /* Read the ``value'' for this node. */ /* -------------------------------------------------------------------- */ char szToken[512]; int nTokenLen = 0; while( *pszInput != '\0' && nTokenLen < (int) sizeof(szToken)-1 ) { if( *pszInput == '"' ) { bInQuotedString = !bInQuotedString; } else if( !bInQuotedString && (*pszInput == '[' || *pszInput == ']' || *pszInput == ',' || *pszInput == '(' || *pszInput == ')' ) ) { break; } else { szToken[nTokenLen++] = *pszInput; } pszInput++; } if( *pszInput == '\0' || nTokenLen == sizeof(szToken) - 1 ) return OGRERR_CORRUPT_DATA; szToken[nTokenLen++] = '\0'; SetValue( szToken ); /* -------------------------------------------------------------------- */ /* Read children, if we have a sublist. */ /* -------------------------------------------------------------------- */ if( *pszInput == '[' || *pszInput == '(' ) { do { OGR_SRSNode *poNewChild; OGRErr eErr; pszInput++; // Skip bracket or comma. poNewChild = new OGR_SRSNode(); eErr = poNewChild->importFromWkt( (char **) &pszInput ); if( eErr != OGRERR_NONE ) return eErr; AddChild( poNewChild ); } while( *pszInput == ',' ); if( *pszInput != ')' && *pszInput != ']' ) return OGRERR_CORRUPT_DATA; pszInput++; } *ppszInput = (char *) pszInput; return OGRERR_NONE; }