LinkHeader::LinkHeader(CharacterType*& position, CharacterType* const end) { ASSERT(position <= end); auto urlResult = findURLBoundaries(position, end); if (urlResult == std::nullopt) { m_isValid = false; findNextHeader(position, end); return; } m_url = urlResult.value(); while (m_isValid && position < end) { if (!parseParameterDelimiter(position, end, m_isValid)) { findNextHeader(position, end); return; } LinkParameterName parameterName; if (!parseParameterName(position, end, parameterName)) { findNextHeader(position, end); m_isValid = false; return; } String parameterValue; if (!parseParameterValue(position, end, parameterValue) && !isExtensionParameter(parameterName)) { findNextHeader(position, end); m_isValid = false; return; } setValue(parameterName, parameterValue); } findNextHeader(position, end); }
LinkHeader::LinkHeader(CharType*& position, CharType* end) : m_crossOrigin(CrossOriginAttributeNotSet) , m_isValid(true) { if (!parseURL(position, end, m_url)) { m_isValid = false; findNextHeader(position, end); return; } while (m_isValid && position < end) { if (!parseParameterDelimiter(position, end, m_isValid)) { findNextHeader(position, end); return; } LinkParameterName parameterName; if (!parseParameterName(position, end, parameterName)) { findNextHeader(position, end); m_isValid = false; return; } String parameterValue; if (!parseParameterValue(position, end, parameterValue) && !isExtensionParameter(parameterName)) { findNextHeader(position, end); m_isValid = false; return; } setValue(parameterName, parameterValue); } findNextHeader(position, end); }
/** Given a char array with the contents of a .dcp, this method will allocate and return a populated Parameters struct */ void parseParameters(char *filecontents) { char *line = NULL, *linectx = NULL; int numParameters = 0; line = strtok_r( filecontents, "\n", &linectx ); Parameter *curParam = NULL; // The current one we're parsing while( line != NULL ) { //print_gecko("Line [%s]\r\n", line); if(line[0] != '#') { char *key, *namectx = NULL; char *value = NULL; key = strtok_r(line, "=", &namectx); if(key != NULL) value = strtok_r(NULL, "=", &namectx); if(value != NULL) { //print_gecko("Key [%s] Value [%s]\r\n", key, value); } if(!stricmp("Name", key)) { curParam = (Parameter*)&_parameters.parameters[numParameters]; memset(curParam, 0, sizeof(Parameter)); //print_gecko("Current Param %08X\r\n", curParam); parseParameterValue(value, &curParam->arg); numParameters++; } else if(!stricmp("Values", key)) { char *valuePairStart = strchr(value, '{'); int numValues = 0; while(valuePairStart != NULL) { parseParameterValue(valuePairStart, &curParam->values[numValues]); valuePairStart = strchr(valuePairStart+1, '{'); numValues++; } curParam->num_values = numValues; } } // And round we go again line = strtok_r( NULL, "\n", &linectx); } _parameters.num_params = numParameters; //printParams(getParameters()); }