Change-Id: I553dc69083878bb33d0a62f512622d77be9cdee9 Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/64068 Reviewed-by: David Benjamin <davidben@google.com> Commit-Queue: Bob Beck <bbe@google.com>chromium-stable
parent
6beabf3f44
commit
71fb2a4e07
3 changed files with 0 additions and 566 deletions
@ -1,30 +0,0 @@ |
||||
#!/bin/sh |
||||
|
||||
# Set this to be the location of a chromium checkout, and |
||||
# apply the patches in ./patches with "git am" first |
||||
# before running this script. |
||||
CHROMIUM_SRC=~/chromium/src |
||||
|
||||
mkdir -p ./testdata |
||||
cp $CHROMIUM_SRC/net/test/test_certificate_data.h ./testdata |
||||
|
||||
tar -C $CHROMIUM_SRC/net/third_party -cf - nist-pkits | tar -C ./testdata -xf - |
||||
tar -C $CHROMIUM_SRC/net/data -cf - cert_issuer_source_static_unittest \ |
||||
ssl/certificates \ |
||||
certificate_policies_unittest \ |
||||
name_constraints_unittest \ |
||||
ocsp_unittest \ |
||||
crl_unittest \ |
||||
parse_certificate_unittest \ |
||||
path_builder_unittest \ |
||||
verify_certificate_chain_unittest \ |
||||
verify_name_match_unittest \ |
||||
verify_signed_data_unittest | tar -C ./testdata -xf - |
||||
|
||||
go run ./import_tool.go -spec import_spec.json --source-base $CHROMIUM_SRC -dest-base . |
||||
|
||||
sed -i "s/#include \"/#include \"..\/pki\//g" *fuzzer.cc |
||||
mv *fuzzer.cc ../fuzz |
||||
|
||||
|
||||
|
@ -1,349 +0,0 @@ |
||||
{ |
||||
"replacements": [ |
||||
{"match": "^#include \"base/supports_user_data.h\"", |
||||
"replace": ""}, |
||||
{"match": ": public base::SupportsUserData", |
||||
"replace": ""}, |
||||
{"match": "~Result\\(\\) override;", |
||||
"replace": "~Result();"}, |
||||
{"match": "base::SupportsUserData", |
||||
"replace": "void"}, |
||||
{"match": "^#include \"net/dns/dns_util.h\"", |
||||
"replace": ""}, |
||||
{"match": "^#include \"base/gtest_prod_util.h\"", |
||||
"replace": ""}, |
||||
{"match": "^#include \"base/pickle.h\"", |
||||
"replace": ""}, |
||||
{"match": "^#include \"base/check.h\"", |
||||
"replace": "#include \"fillins/check.h\""}, |
||||
{"match": "^#include \"base/notreached.h\"", |
||||
"replace": ""}, |
||||
{"match": "^#include \"base/check_op.h\"", |
||||
"replace": "#include \"fillins/check.h\""}, |
||||
{"match": "^#include \"net/base/hash_value.h\"", |
||||
"replace": "#include \"fillins/hash_value.h\""}, |
||||
{"match": "^#include \"net/cert/x509_util.h\"", |
||||
"replace": "#include \"fillins/x509_util.h\""}, |
||||
{"match": "^#include \"url/gurl.h\"", |
||||
"replace": "#include \"webutil/url/url.h\""}, |
||||
{"match": "^#include \"build/build_config.h\"", |
||||
"replace": ""}, |
||||
{"match": "^#include \"base/numerics/clamped_math.h\"", |
||||
"replace": "#include \"fillins/clamped_math.h\""}, |
||||
{"match": "^#include \"base/numerics/safe_conversions.h\"", |
||||
"replace": ""}, |
||||
{"match": "^#include \"net/base/net_export.h\"", |
||||
"replace": ""}, |
||||
{"match": "^#include \"base/strings/string_util.h\"", |
||||
"replace": "#include \"fillins/fillins_string_util.h\""}, |
||||
{"match": "^#include \"base/base_paths.h\"", |
||||
"replace": "#include \"fillins/path_service.h\"", |
||||
"using": ["bssl::fillins::PathService"]}, |
||||
{"match": "base::PathService", |
||||
"replace": "bssl::fillins::PathService"}, |
||||
{"match": "base::ClampAdd", |
||||
"replace": "bssl::fillins::ClampAdd"}, |
||||
{"match": "base::ClampMul", |
||||
"replace": "bssl::fillins::ClampAdd"}, |
||||
{"match": "^#include \"base/files/file_util.h\"", |
||||
"replace": "#include \"fillins/file_util.h\""}, |
||||
{"match": "^#include \"base/path_service.h\"", |
||||
"replace": ""}, |
||||
{"match": "^#include \"crypto/openssl_util.h\"", |
||||
"replace": "#include \"fillins/openssl_util.h\""}, |
||||
{"match": "\"net/data/", |
||||
"replace": "\"testdata/"}, |
||||
{"match": "\"net/third_party/nist-pkits", |
||||
"replace": "\"testdata/nist-pkits"}, |
||||
{"match": "^#include \"net/base/net_errors.h\"", |
||||
"replace": "#include \"fillins/log.h\"\n#include \"fillins/net_errors.h\"\n"}, |
||||
{"match": "^#include \"net/test/test_certificate_data.h\"", |
||||
"replace": "#include \"testdata/test_certificate_data.h\""}, |
||||
{"match": "^#include \"net/third_party/nist-pkits/pkits_testcases-inl.h\"", |
||||
"replace": "#include \"testdata/nist-pkits/pkits_testcases-inl.h\""}, |
||||
{"match": "^#include \"base/sys_byteorder.h\"", |
||||
"replace": "#include \"fillins/inet.h\""}, |
||||
{"match": "^#include \"base/third_party/icu/icu_utf.h\"", |
||||
"replace": "#include \"fillins/utf_string_conversions.h\""}, |
||||
{"match": "^#include \"base/strings/utf_string_conversions.h\"", |
||||
"replace": "#include \"fillins/utf_string_conversions.h\""}, |
||||
{"match": "^#include \"base/strings/utf_string_conversion_utils.h\"", |
||||
"replace": ""}, |
||||
{"match": "^#include \"base/memory/ref_counted.h\"", |
||||
"replace": "#include <memory>"}, |
||||
{"match": "^#include \"base/base64.h\"", |
||||
"replace": "#include \"fillins/fillins_base64.h\""}, |
||||
{"match": "^#include \"base/strings/stringprintf.h\"", |
||||
"replace": ""}, |
||||
{"match": "^#include \"third_party/boringssl/src/include/openssl/(.*).h\"", |
||||
"replace": "#include <openssl/$1.h>"}, |
||||
{"match": "^#include \"net/cert/pki/", |
||||
"replace": "#include \""}, |
||||
{"match": "^#include \"net/cert/", |
||||
"replace": "#include \""}, |
||||
{"match": "^#include \"net/der/", |
||||
"replace": "#include \""}, |
||||
{"match": "^#include \"net/", |
||||
"replace": "#include \""}, |
||||
{"match": "^#include \"net_buildflags.h\"", |
||||
"replace": ""}, |
||||
{"match": "^#include \"base/time/time.h\"", |
||||
"replace": ""}, |
||||
{"match": "^#include \"base/strings/string_piece.h\"", |
||||
"replace": "#include <string_view>\n"}, |
||||
{"match": "^#include \"testing/gtest/include/gtest/gtest.h\"", |
||||
"replace": "#include <gtest/gtest.h>"}, |
||||
{"match": "^#include \"testing/gmock/include/gmock/gmock.h\"", |
||||
"replace": "#include <gmock/gmock.h>"}, |
||||
{"match": "^#include \"base/containers/span.h\"", |
||||
"replace": "#include <openssl/span.h>"}, |
||||
{"match": "^#include \"third_party/abseil-cpp/absl/types/optional.h\"", |
||||
"replace": "#include <optional>"}, |
||||
{"match": "^#include \"base/containers/contains.h\"", |
||||
"replace": ""}, |
||||
{"match": "LOG(ERROR)", |
||||
"replace": "std::cerr"}, |
||||
{"match": "GURL", |
||||
"replace": "URL", |
||||
"include": "webutil/url/url.h"}, |
||||
{"match": "absl::nullopt", |
||||
"replace": "std::nullopt" }, |
||||
{"match": "absl::optional", |
||||
"replace": "std::optional" }, |
||||
{"match": "absl::make_optional", |
||||
"replace": "std::make_optional" }, |
||||
{"match": "base::span", |
||||
"replace": "bssl::Span" }, |
||||
{"match": "base::make_span", |
||||
"replace": "bssl::MakeSpan" }, |
||||
{"match": "base::as_bytes", |
||||
"replace": "fillins::as_bytes", |
||||
"include": "fillins/bits.h"}, |
||||
{"match": "^namespace net {", |
||||
"replace": "namespace bssl {"}, |
||||
{"match": "namespace net::([^ ]+) {", |
||||
"replace": "namespace bssl::$1 {"}, |
||||
{"match": "NET_EXPORT_PRIVATE ", |
||||
"replace": "OPENSSL_EXPORT ", |
||||
"include": "fillins/openssl_util.h"}, |
||||
{"match": "NET_EXPORT ", |
||||
"replace": "OPENSSL_EXPORT ", |
||||
"include": "fillins/openssl_util.h"}, |
||||
{"match": "NOTREACHED\\(\\)", |
||||
"replace": "abort(); //NOTREACHED" }, |
||||
{"match": "NOTREACHED_NORETURN\\(\\)", |
||||
"replace": "abort(); //NOTREACHED_NORETURN" }, |
||||
{"match": "FRIEND_TEST_ALL_PREFIXES\\(.+;", |
||||
"replace": ""}, |
||||
{"match": " NET_DER", |
||||
"replace": " BSSL_DER"}, |
||||
{"match": " NET_CERT_PKI", |
||||
"replace": " BSSL_PKI"}, |
||||
{"match": " NET_CERT", |
||||
"replace": " BSSL_PKI"}, |
||||
{"match": "^using base::StringPiece;", |
||||
"replace": ""}, |
||||
{"match": "base::StringPiece", |
||||
"replace": "std::string_view"}, |
||||
{"match": "base::StartsWith\\(", |
||||
"replace": "bssl::string_util::StartsWith(", |
||||
"include": "string_util.h"}, |
||||
{"match": "base::StringPrintf", |
||||
"replace": "absl::StrFormat", |
||||
"include": "third_party/absl/strings/str_format.h"}, |
||||
{"match": "base::Base64Encode", |
||||
"replace": "fillins::Base64Encode"}, |
||||
{"match": "base::Base64Decode", |
||||
"replace": "fillins::Base64Decode"}, |
||||
{"match": "base::ReadFileToString", |
||||
"replace": "fillins::ReadFileToString"}, |
||||
{"match": "base::CollapseWhitespaceASCII", |
||||
"replace": "fillins::CollapseWhitespaceASCII"}, |
||||
{"match": "base::FilePath", |
||||
"replace": "fillins::FilePath"}, |
||||
{"match": "base::DIR_SRC_TEST_DATA_ROOT", |
||||
"replace": "fillins::BSSL_TEST_DATA_ROOT"}, |
||||
{"match": "base::NetToHost16\\(", |
||||
"replace": "ntohs("}, |
||||
{"match": "base::NetToHost32\\(", |
||||
"replace": "ntohl("}, |
||||
{ "match": "base_icu::UChar32", |
||||
"replace": "uint32_t"}, |
||||
{"match": "base::WriteUnicodeCharacter\\(", |
||||
"replace": "fillins::WriteUnicodeCharacter("}, |
||||
{"match": "base::IsAsciiAlpha\\(", |
||||
"replace": "fillins::IsAsciiAlpha("}, |
||||
{"match": "scoped_refptr<", |
||||
"replace": "std::shared_ptr<"}, |
||||
{"match": ": public base::RefCountedThreadSafe<.+>", |
||||
"replace": ""}, |
||||
{"match": "friend class base::RefCountedThreadSafe<.+>;", |
||||
"replace": ""}, |
||||
{"match": "\\bnet::", |
||||
"replace": "bssl::"}, |
||||
{"match": "base::Time::Exploded", |
||||
"replace": "fillins::Exploded", |
||||
"include": "fillins/time.h"}, |
||||
{"match": "([a-zA-Z_0-9]+)\\.UTCExplode\\(&([^)]*)\\)", |
||||
"replace": "fillins::UTCExplode($1, &$2)"}, |
||||
{"match": "net::ReadTestFileToString\\(", |
||||
"replace": "ReadTestFileToString("}, |
||||
{"match": "base::Seconds\\(", |
||||
"replace": "absl::Seconds("}, |
||||
{"match": "base::Time::UnixEpoch\\(", |
||||
"replace": "absl::UnixEpoch("}, |
||||
{"match": "base::Time::FromUTCExploded\\(", |
||||
"replace": "fillins::FromUTCExploded(", |
||||
"include": "fillins/time.h"}, |
||||
{"match": "base::Time::Now\\(\\)", |
||||
"replace": "absl::Now()"}, |
||||
{"match": "base::Time::Min\\(\\)", |
||||
"replace": "absl::InfinitePast()"}, |
||||
{"match": "base::Time::Max\\(\\)", |
||||
"replace": "absl::InfiniteFuture()"}, |
||||
{"match": "base::Time", |
||||
"replace": "absl::Time", |
||||
"include": "fillins/time.h"}, |
||||
{"match": "constexpr absl::Time", |
||||
"replace": "const absl::Time"}, |
||||
{"match": "^ // Map from OID to ParsedExtension.$", |
||||
"replace": "~ParsedCertificate();\n$0"}, |
||||
{"match": "^ ~ParsedCertificate\\(\\);$", |
||||
"replace": " "}, |
||||
{"match": "crypto::OpenSSLErrStackTracer", |
||||
"replace": "fillins::OpenSSLErrStackTracer"}, |
||||
{"match": "\\(FROM_HERE\\)", |
||||
"replace": ""}, |
||||
{"match": "([^a-zA-Z])StringPiece([^a-zA-Z])", |
||||
"replace": "${1}std::string_view$2"}, |
||||
{"match": "crypto::kSHA256Length", |
||||
"replace": "SHA256_DIGEST_LENGTH"}, |
||||
{"match": "raw_ptr<([^>]*)>", |
||||
"replace": "$1 *"} |
||||
], |
||||
"files": [ |
||||
"net/cert/asn1_util.h", |
||||
"net/cert/asn1_util.cc", |
||||
"net/cert/cert_status_flags.h", |
||||
"net/cert/cert_status_flags_list.h", |
||||
"net/cert/cert_verify_proc_blocklist.inc", |
||||
"net/cert/pki/cert_error_id.cc", |
||||
"net/cert/pki/cert_error_id.h", |
||||
"net/cert/pki/cert_error_params.cc", |
||||
"net/cert/pki/cert_error_params.h", |
||||
"net/cert/pki/cert_errors.cc", |
||||
"net/cert/pki/cert_errors.h", |
||||
"net/cert/pki/certificate_policies.cc", |
||||
"net/cert/pki/certificate_policies.h", |
||||
"net/cert/pki/certificate_policies_unittest.cc", |
||||
"net/cert/pki/cert_issuer_source.h", |
||||
"net/cert/pki/cert_issuer_source_static.cc", |
||||
"net/cert/pki/cert_issuer_source_static.h", |
||||
"net/cert/pki/cert_issuer_source_static_unittest.cc", |
||||
"net/cert/pki/cert_issuer_source_sync_unittest.h", |
||||
"net/cert/pki/common_cert_errors.cc", |
||||
"net/cert/pki/common_cert_errors.h", |
||||
"net/cert/pki/crl.h", |
||||
"net/cert/pki/crl.cc", |
||||
"net/cert/pki/crl_unittest.cc", |
||||
"net/cert/pki/crl_parse_crl_certificatelist_fuzzer.cc", |
||||
"net/cert/pki/crl_parse_crl_tbscertlist_fuzzer.cc", |
||||
"net/cert/pki/crl_parse_issuing_distribution_point_fuzzer.cc", |
||||
"net/cert/pki/crl_getcrlstatusforcert_fuzzer.cc", |
||||
"net/cert/pki/extended_key_usage.cc", |
||||
"net/cert/pki/extended_key_usage.h", |
||||
"net/cert/pki/extended_key_usage_unittest.cc", |
||||
"net/cert/pki/general_names.h", |
||||
"net/cert/pki/general_names.cc", |
||||
"net/cert/pki/general_names_unittest.cc", |
||||
"net/cert/pki/ip_util.h", |
||||
"net/cert/pki/ip_util.cc", |
||||
"net/cert/pki/ip_util_unittest.cc", |
||||
"net/cert/pki/mock_signature_verify_cache.h", |
||||
"net/cert/pki/mock_signature_verify_cache.cc", |
||||
"net/cert/pki/name_constraints.cc", |
||||
"net/cert/pki/name_constraints.h", |
||||
"net/cert/pki/name_constraints_unittest.cc", |
||||
"net/cert/pki/nist_pkits_unittest.cc", |
||||
"net/cert/pki/nist_pkits_unittest.h", |
||||
"net/cert/pki/ocsp.cc", |
||||
"net/cert/pki/ocsp.h", |
||||
"net/cert/pki/ocsp_parse_ocsp_cert_id_fuzzer.cc", |
||||
"net/cert/pki/ocsp_parse_ocsp_response_data_fuzzer.cc", |
||||
"net/cert/pki/ocsp_parse_ocsp_response_fuzzer.cc", |
||||
"net/cert/pki/ocsp_parse_ocsp_single_response_fuzzer.cc", |
||||
"net/cert/pki/ocsp_unittest.cc", |
||||
"net/cert/pki/parse_authority_key_identifier_fuzzer.cc", |
||||
"net/cert/pki/parse_certificate.cc", |
||||
"net/cert/pki/parse_certificate.h", |
||||
"net/cert/pki/parse_certificate_unittest.cc", |
||||
"net/cert/pki/parsed_certificate.cc", |
||||
"net/cert/pki/parsed_certificate.h", |
||||
"net/cert/pki/parse_certificate_fuzzer.cc", |
||||
"net/cert/pki/parsed_certificate_unittest.cc", |
||||
"net/cert/pki/parse_crldp_fuzzer.cc", |
||||
"net/cert/pki/parse_name.cc", |
||||
"net/cert/pki/parse_name.h", |
||||
"net/cert/pki/parse_name_unittest.cc", |
||||
"net/cert/pki/path_builder.cc", |
||||
"net/cert/pki/path_builder.h", |
||||
"net/cert/pki/path_builder_pkits_unittest.cc", |
||||
"net/cert/pki/path_builder_unittest.cc", |
||||
"net/cert/pki/path_builder_verify_certificate_chain_unittest.cc", |
||||
"net/cert/pki/revocation_util.h", |
||||
"net/cert/pki/revocation_util.cc", |
||||
"net/cert/pki/signature_algorithm.cc", |
||||
"net/cert/pki/signature_algorithm.h", |
||||
"net/cert/pki/signature_algorithm_unittest.cc", |
||||
"net/cert/pki/simple_path_builder_delegate.cc", |
||||
"net/cert/pki/simple_path_builder_delegate.h", |
||||
"net/cert/pki/simple_path_builder_delegate_unittest.cc", |
||||
"net/cert/pki/string_util.cc", |
||||
"net/cert/pki/string_util_unittest.cc", |
||||
"net/cert/pki/string_util.h", |
||||
"net/cert/pki/signature_verify_cache.h", |
||||
"net/cert/pki/test_helpers.cc", |
||||
"net/cert/pki/test_helpers.h", |
||||
"net/cert/pki/trust_store.cc", |
||||
"net/cert/pki/trust_store_collection.cc", |
||||
"net/cert/pki/trust_store_collection.h", |
||||
"net/cert/pki/trust_store_collection_unittest.cc", |
||||
"net/cert/pki/trust_store.h", |
||||
"net/cert/pki/trust_store_in_memory.cc", |
||||
"net/cert/pki/trust_store_in_memory.h", |
||||
"net/cert/pki/verify_certificate_chain.cc", |
||||
"net/cert/pki/verify_certificate_chain.h", |
||||
"net/cert/pki/verify_certificate_chain_pkits_unittest.cc", |
||||
"net/cert/pki/verify_certificate_chain_typed_unittest.h", |
||||
"net/cert/pki/verify_certificate_chain_unittest.cc", |
||||
"net/cert/pki/verify_name_match.cc", |
||||
"net/cert/pki/verify_name_match.h", |
||||
"net/cert/pki/verify_name_match_unittest.cc", |
||||
"net/cert/pki/verify_name_match_fuzzer.cc", |
||||
"net/cert/pki/verify_name_match_normalizename_fuzzer.cc", |
||||
"net/cert/pki/verify_name_match_verifynameinsubtree_fuzzer.cc", |
||||
"net/cert/pki/verify_signed_data.cc", |
||||
"net/cert/pki/verify_signed_data.h", |
||||
"net/cert/pki/verify_signed_data_unittest.cc", |
||||
"net/cert/ocsp_revocation_status.h", |
||||
"net/cert/ocsp_verify_result.h", |
||||
"net/cert/ocsp_verify_result.cc", |
||||
"net/cert/pem.cc", |
||||
"net/cert/pem.h", |
||||
"net/cert/pem_unittest.cc", |
||||
"net/der/encode_values.cc", |
||||
"net/der/encode_values.h", |
||||
"net/der/encode_values_unittest.cc", |
||||
"net/der/input.cc", |
||||
"net/der/input.h", |
||||
"net/der/input_unittest.cc", |
||||
"net/der/parser.cc", |
||||
"net/der/parser.h", |
||||
"net/der/parser_unittest.cc", |
||||
"net/der/parse_values.cc", |
||||
"net/der/parse_values.h", |
||||
"net/der/parse_values_unittest.cc", |
||||
"net/der/tag.cc", |
||||
"net/der/tag.h" |
||||
] |
||||
} |
@ -1,187 +0,0 @@ |
||||
// import_tool is a quick tool for importing Chromium's certificate verifier
|
||||
// code into google3. In time it might be replaced by Copybara, but this is a
|
||||
// lighter-weight solution while we're quickly iterating and only going in one
|
||||
// direction.
|
||||
//
|
||||
// Usage: ./import_tool -spec import_spec.json\
|
||||
// -source-base ~/src/chromium/src/net\
|
||||
// -dest-base .
|
||||
package main |
||||
|
||||
import ( |
||||
"bufio" |
||||
"encoding/json" |
||||
"errors" |
||||
"flag" |
||||
"fmt" |
||||
"io/ioutil" |
||||
"os" |
||||
"path/filepath" |
||||
"regexp" |
||||
"strings" |
||||
"sync" |
||||
"sync/atomic" |
||||
) |
||||
|
||||
type specification struct { |
||||
Replacements []replacement `json:"replacements"` |
||||
Files []string `json:"files"` |
||||
} |
||||
|
||||
type replacement struct { |
||||
Match string `json:"match"` |
||||
matchRE *regexp.Regexp `json:"-"` |
||||
Replace string `json:"replace"` |
||||
Include string `json:"include"` |
||||
Using []string `json:"using"` |
||||
used uint32 |
||||
} |
||||
|
||||
var ( |
||||
specFile *string = flag.String("spec", "", "Location of spec JSON") |
||||
sourceBase *string = flag.String("source-base", "", "Path of the source files") |
||||
destBase *string = flag.String("dest-base", "", "Path of the destination files") |
||||
) |
||||
|
||||
func transformFile(spec *specification, filename string) error { |
||||
const newLine = "\n" |
||||
|
||||
sourcePath := filepath.Join(*sourceBase, filename) |
||||
destPath := filename |
||||
destPath = strings.TrimPrefix(destPath, "net/") |
||||
destPath = strings.TrimPrefix(destPath, "cert/") |
||||
destPath = strings.TrimPrefix(destPath, "der/") |
||||
destPath = strings.TrimPrefix(destPath, "pki/") |
||||
destPath = filepath.Join(*destBase, destPath) |
||||
destDir := filepath.Dir(destPath) |
||||
if err := os.MkdirAll(destDir, 0755); err != nil { |
||||
return err |
||||
} |
||||
|
||||
source, err := os.Open(sourcePath) |
||||
if err != nil { |
||||
return err |
||||
} |
||||
defer source.Close() |
||||
|
||||
dest, err := os.OpenFile(destPath, os.O_CREATE|os.O_TRUNC|os.O_WRONLY, 0644) |
||||
if err != nil { |
||||
return err |
||||
} |
||||
defer dest.Close() |
||||
|
||||
var using []string |
||||
var includeInsertionPoint int |
||||
includes := make(map[string]struct{}) |
||||
scanner := bufio.NewScanner(source) |
||||
out := "" |
||||
for scanner.Scan() { |
||||
line := scanner.Text() |
||||
|
||||
if includeInsertionPoint == 0 && len(line) > 0 && |
||||
!strings.HasPrefix(line, "// ") && |
||||
!strings.HasPrefix(line, "#if") && |
||||
!strings.HasPrefix(line, "#define ") { |
||||
includeInsertionPoint = len(out) |
||||
} |
||||
|
||||
for i, repl := range spec.Replacements { |
||||
if !repl.matchRE.MatchString(line) { |
||||
continue |
||||
} |
||||
line = repl.matchRE.ReplaceAllString(line, repl.Replace) |
||||
atomic.StoreUint32(&spec.Replacements[i].used, 1) |
||||
using = append(using, repl.Using...) |
||||
if repl.Include != "" { |
||||
includes[repl.Include] = struct{}{} |
||||
} |
||||
} |
||||
|
||||
for _, u := range using { |
||||
line = strings.Replace( |
||||
line, "namespace chromium_certificate_verifier {", |
||||
"namespace chromium_certificate_verifier {\nusing "+u+";", 1) |
||||
} |
||||
|
||||
out += line |
||||
out += newLine |
||||
} |
||||
|
||||
if len(includes) > 0 { |
||||
if includeInsertionPoint == 0 { |
||||
panic("failed to find include insertion point for " + filename) |
||||
} |
||||
|
||||
var s string |
||||
for include := range includes { |
||||
s = s + "#include \"" + include + "\"\n" |
||||
} |
||||
|
||||
out = out[:includeInsertionPoint] + s + out[includeInsertionPoint:] |
||||
} |
||||
|
||||
dest.WriteString(out) |
||||
fmt.Printf("%s\n", filename) |
||||
|
||||
return nil |
||||
} |
||||
|
||||
func do() error { |
||||
flag.Parse() |
||||
|
||||
specBytes, err := ioutil.ReadFile(*specFile) |
||||
if err != nil { |
||||
return err |
||||
} |
||||
|
||||
var spec specification |
||||
if err := json.Unmarshal(specBytes, &spec); err != nil { |
||||
if jsonError, ok := err.(*json.SyntaxError); ok { |
||||
return fmt.Errorf("JSON parse error at offset %v: %v", jsonError.Offset, err.Error()) |
||||
} |
||||
return errors.New("JSON parse error: " + err.Error()) |
||||
} |
||||
|
||||
for i, repl := range spec.Replacements { |
||||
var err error |
||||
spec.Replacements[i].matchRE, err = regexp.Compile(repl.Match) |
||||
if err != nil { |
||||
return fmt.Errorf("Failed to parse %q: %s", repl.Match, err) |
||||
} |
||||
} |
||||
|
||||
errors := make(chan error, len(spec.Files)) |
||||
var wg sync.WaitGroup |
||||
|
||||
for _, filename := range spec.Files { |
||||
wg.Add(1) |
||||
|
||||
go func(filename string) { |
||||
if err := transformFile(&spec, filename); err != nil { |
||||
errors <- err |
||||
} |
||||
wg.Done() |
||||
}(filename) |
||||
} |
||||
|
||||
wg.Wait() |
||||
select { |
||||
case err := <-errors: |
||||
return err |
||||
default: |
||||
break |
||||
} |
||||
for _, repl := range spec.Replacements { |
||||
if repl.used == 0 { |
||||
fmt.Fprintf(os.Stderr, "replacement for \"%s\" not used\n", repl.Match) |
||||
} |
||||
} |
||||
return nil |
||||
} |
||||
|
||||
func main() { |
||||
if err := do(); err != nil { |
||||
fmt.Fprintf(os.Stderr, "%s\n", err) |
||||
os.Exit(1) |
||||
} |
||||
} |
Loading…
Reference in new issue