void WordGenerator (CXMLElement *pCmdLine) { int i; // Load input file CString sFilespec = pCmdLine->GetAttribute(CONSTLIT("input")); if (sFilespec.IsBlank()) { printf("ERROR: input filename expected.\n"); return; } CFileReadBlock InputFile(sFilespec); if (InputFile.Open() != NOERROR) { printf("ERROR: Unable to open file: %s\n", sFilespec.GetASCIIZPointer()); return; } // "Novel" means that we only generate words that are not // in the input file. bool bNovelWordsOnly = pCmdLine->GetAttributeBool(NOVEL_ATTRIB); // Build up a word generator CMarkovWordGenerator Generator; TMap<CString, DWORD> InputWords; // Read each line of the file char *pPos = InputFile.GetPointer(0); char *pEndPos = pPos + InputFile.GetLength(); while (pPos < pEndPos) { // Skip whitespace while (pPos < pEndPos && (strIsWhitespace(pPos) || *pPos < ' ')) pPos++; // Parse the line char *pStart = pPos; while (pPos < pEndPos && *pPos != '\r' && *pPos != '\n' && *pPos >= ' ') pPos++; CString sWord(pStart, pPos - pStart); // Add the word to the generator if (!sWord.IsBlank()) { Generator.AddSample(strTrimWhitespace(sWord)); // If we are looking for novel words we need to keep a map // of all words in the input file. if (bNovelWordsOnly) InputWords.Insert(sWord); } } // If we have a count, then output a list of random words int iCount; if (pCmdLine->FindAttributeInteger(COUNT_ATTRIB, &iCount)) { if (iCount > 0) { TArray<CString> Result; Generator.GenerateUnique(iCount, &Result); for (i = 0; i < Result.GetCount(); i++) if (InputWords.Find(Result[i])) { Result.Delete(i); i--; } Result.Sort(); for (i = 0; i < Result.GetCount(); i++) printf("%s\n", Result[i].GetASCIIZPointer()); } } // Otherwise, output the generator as XML else { CMemoryWriteStream Output; if (Output.Create() != NOERROR) { printf("ERROR: Out of memory.\n"); return; } if (Generator.WriteAsXML(&Output) != NOERROR) { printf("ERROR: Unable to output generator as XML.\n"); return; } Output.Write("\0", 1); printf(Output.GetPointer()); } }
bool CHexeMarkupEvaluator::ProcessHeader (SHTTPRequestCtx &Ctx, CDatum dResult) // ProcessHeader // // Outputs the given header { // Check for error if (dResult.IsError()) { m_Output.Write(strPattern(ERR_PROCESSING_HEADER, dResult.AsString())); return true; } // Processing depends on result type switch (dResult.GetBasicType()) { case CDatum::typeNil: return true; // If this is a string or anything else, we expect both field and value // are in the same string and we need to parse it. default: { CString sData = dResult.AsString(); // Parse into field and value char *pPos = sData.GetParsePointer(); while (strIsWhitespace(pPos)) pPos++; // Look for the field name char *pStart = pPos; while (*pPos != ':' && *pPos != '\0') pPos++; CString sField(pStart, pPos - pStart); if (sField.IsEmpty()) { m_Output.Write(strPattern(ERR_NO_HEADER_FIELD, sData)); return true; } // Look for the value CString sValue; if (*pPos == ':') { pPos++; while (strIsWhitespace(pPos)) pPos++; sValue = CString(pPos); } // Done CHTTPMessage::SHeader *pNewHeader = m_Headers.Insert(); pNewHeader->sField = sField; pNewHeader->sValue = sValue; } } return true; }
bool CTimeDate::Parse (const CString &sFormat, const CString &sValue, CString *retsError) // Parse // // Parse a date of the given format. { // Internet format: // // Sun, 06 Nov 1994 08:49:37 GMT if (strEquals(sFormat, FORMAT_INTERNET)) { char *pPos = sValue.GetASCIIZPointer(); char *pPosEnd = pPos + sValue.GetLength(); // Skip leading whitespace while (strIsWhitespace(pPos)) pPos++; // Skip day of week while (pPos < pPosEnd && (*pPos < '0' || *pPos > '9')) pPos++; if (pPos >= pPosEnd) goto InvalidValue; // Day bool bFail; m_Time.wDay = strParseInt(pPos, 0, &pPos, &bFail); if (bFail || m_Time.wDay < 1 || m_Time.wDay > 31) goto InvalidValue; pPos++; if (pPos >= pPosEnd) goto InvalidValue; // Month if (*pPos == 'A') { pPos++; if (*pPos == 'p') { m_Time.wMonth = 4; pPos += 3; } else if (*pPos == 'u') { m_Time.wMonth = 8; pPos += 3; } else goto InvalidValue; } else if (*pPos == 'D') { m_Time.wMonth = 12; pPos += 4; } else if (*pPos == 'F') { m_Time.wMonth = 2; pPos += 4; } else if (*pPos == 'J') { pPos++; if (*pPos == 'a') { m_Time.wMonth = 1; pPos += 3; } else if (*pPos == 'u') { pPos++; if (*pPos == 'l') { m_Time.wMonth = 7; pPos += 2; } else if (*pPos == 'n') { m_Time.wMonth = 6; pPos += 2; } else goto InvalidValue; } else goto InvalidValue; } else if (*pPos == 'M') { pPos++; if (*pPos == 'a') { pPos++; if (*pPos == 'r') { m_Time.wMonth = 3; pPos += 2; } else if (*pPos == 'y') { m_Time.wMonth = 5; pPos += 2; } else goto InvalidValue; } else goto InvalidValue; } else if (*pPos == 'N') { m_Time.wMonth = 11; pPos += 4; } else if (*pPos == 'O') { m_Time.wMonth = 10; pPos += 4; } else if (*pPos == 'S') { m_Time.wMonth = 9; pPos += 4; } else goto InvalidValue; if (pPos >= pPosEnd) goto InvalidValue; // Year m_Time.wYear = strParseInt(pPos, 0, &pPos, &bFail); if (bFail || m_Time.wYear < 1) goto InvalidValue; pPos++; if (pPos >= pPosEnd) goto InvalidValue; // Hour m_Time.wHour = strParseInt(pPos, 0, &pPos, &bFail); if (bFail || m_Time.wHour > 23) goto InvalidValue; pPos++; if (pPos >= pPosEnd) goto InvalidValue; // Minute m_Time.wMinute = strParseInt(pPos, 0, &pPos, &bFail); if (bFail || m_Time.wMinute > 59) goto InvalidValue; pPos++; if (pPos >= pPosEnd) goto InvalidValue; // Second m_Time.wSecond = strParseInt(pPos, 0, &pPos, &bFail); if (bFail || m_Time.wSecond > 59) goto InvalidValue; // Millisecond is not stored m_Time.wMilliseconds = 0; // We don't store day of week m_Time.wDayOfWeek = 0xffff; // Done return true; InvalidValue: if (retsError) *retsError = strPatternSubst(CONSTLIT("Invalid date value: %s"), sValue); return false; } else { if (retsError) *retsError = strPatternSubst(CONSTLIT("Unsupported date format: %s."), sFormat); return false; } }
inline bool IsDelimiterChar (char *pPos, bool bIsSpecialAttrib = false) { return (*pPos == '\0' || *pPos == ',' || *pPos == ';' || (!bIsSpecialAttrib && strIsWhitespace(pPos))); }