//------------------------------------------------------------------------ // Find all the kernels, plus their parameter names and types //------------------------------------------------------------------------ void FindKernels(const string& src, KernelList& out_kernels) { const string kernelDelimiters(" ,()\n\r\t"); // find the kernel names and parameters Tokenizer tokenizer(src, kernelDelimiters); int srcIndex; while (Tokenizer::TOKEN_END != (srcIndex = tokenizer.NextToken())) { string token; tokenizer.GetToken(token); // must be of form "kernel SOMETHING myKernelName(...." if (("kernel" == token) || ("__kernel" == token)) { // structure to be returned containing kernel name & parameters KernelStrings kernelStrings; // handle multiple attributes while (true) { int attrIndex = tokenizer.SkipTokens("__attribute__", ")"); if (attrIndex == srcIndex) break; srcIndex = attrIndex; } int index = GetParameterString(src, srcIndex, kernelStrings.m_parameters); if (0 == index) { break; // error condition encountered, skip this kernel } srcIndex = tokenizer.NextToken(); if (Tokenizer::TOKEN_END == srcIndex) { break; // error condition encountered, skip this kernel } // this should be the name srcIndex = tokenizer.NextToken(); if (Tokenizer::TOKEN_END == srcIndex) { break; // error condition encountered, skip this kernel } // get kernel name tokenizer.GetToken(kernelStrings.m_kernelName); // add kernel name to list out_kernels.push_back(kernelStrings); // scoot tokenizer forward past the parameters (we got this index from GetParameterString) tokenizer.SetStartIndex(index); } } }
/** * @brief Retrieve contents of keyword * * This method retrieves the contents of a keyword. It is specifically * designed to handle Kernel group keywords. As such, any value of "Table" * found in the keyword is not added to the kernel list. * * * @param pvl ISIS label containing the Kernels group. * @param kname Name of keyword to extract * @param manage Default management state to assign to kernels. The default * is to manage the kernels that are found. See examine() for * full disclosure of how this is set. * * @return Kernels::KernelList List of scrutinized kernel file names */ Kernels::KernelList Kernels::findKernels(Pvl &pvl, const QString &kname, const bool &manage) { KernelList klist; // Get the kernel group and load main kernels PvlGroup &kernels = pvl.findGroup("Kernels",Pvl::Traverse); // Check for the keyword if (kernels.hasKeyword(kname)) { PvlKeyword &kkey = kernels[kname]; for (int i = 0 ; i < kkey.size() ; i++) { if (!kkey.isNull(i)) { if (kkey[i].toLower() != "table") { klist.push_back(examine(kkey[i], manage)); } } } } return (klist); }