//------------------------------------------------------------------------
// 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);
        }
    }
}
Пример #2
0
  /**
   * @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);
  }