/* * Copyright 2022 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #include "src/base/SkStringView.h" #include "tools/skslc/ProcessWorklist.h" #include #include #include ResultCode ProcessWorklist( const char* worklistPath, const std::function args)>& processCommandFn) { std::string inputPath(worklistPath); if (!skstd::ends_with(inputPath, ".worklist")) { printf("expected .worklist file, found: %s\n\n", worklistPath); return ResultCode::kConfigurationError; } // The worklist contains one line per argument to pass. When a blank line is reached, those // arguments will be passed to `processCommandFn`. auto resultCode = ResultCode::kSuccess; std::vector args = {"sksl"}; std::ifstream in(worklistPath); for (std::string line; std::getline(in, line); ) { if (in.rdstate()) { printf("error reading '%s'\n", worklistPath); return ResultCode::kInputError; } if (!line.empty()) { // We found an argument. Remember it. args.push_back(std::move(line)); } else { // We found a blank line. If we have any arguments stored up, process them as a command. if (!args.empty()) { ResultCode outcome = processCommandFn(args); resultCode = std::max(resultCode, outcome); // Clear every argument except the first. args.resize(1); } } } // If the worklist ended with a list of arguments but no blank line, process those now. if (args.size() > 1) { ResultCode outcome = processCommandFn(args); resultCode = std::max(resultCode, outcome); } // Return the "worst" status we encountered. For our purposes, compilation errors are the least // serious, because they are expected to occur in unit tests. Other types of errors are not // expected at all during a build. return resultCode; }