File: Age.swift

package info (click to toggle)
swiftlang 6.0.3-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 2,519,992 kB
  • sloc: cpp: 9,107,863; ansic: 2,040,022; asm: 1,135,751; python: 296,500; objc: 82,456; f90: 60,502; lisp: 34,951; pascal: 19,946; sh: 18,133; perl: 7,482; ml: 4,937; javascript: 4,117; makefile: 3,840; awk: 3,535; xml: 914; fortran: 619; cs: 573; ruby: 573
file content (97 lines) | stat: -rw-r--r-- 2,627 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
//===----------------------------------------------------------------------===//
//
// This source file is part of the Swift.org open source project
//
// Copyright (c) 2021 Apple Inc. and the Swift project authors
// Licensed under Apache License v2.0 with Runtime Library Exception
//
// See https://swift.org/LICENSE.txt for license information
// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
//
//===----------------------------------------------------------------------===//

import GenUtils

func getAge(
  from data: String,
  into result: inout [(ClosedRange<UInt32>, [UInt8])]
) {
  for line in data.split(separator: "\n") {
    // Skip comments
    guard !line.hasPrefix("#") else {
      continue
    }
    
    let info = line.split(separator: "#")
    let components = info[0].split(separator: ";")
    
    let scalars: ClosedRange<UInt32>
    
    let filteredScalars = components[0].filter { !$0.isWhitespace }
    
    // If we have . appear, it means we have a legitimate range. Otherwise,
    // it's a singular scalar.
    if filteredScalars.contains(".") {
      let range = filteredScalars.split(separator: ".")
      
      scalars = UInt32(range[0], radix: 16)! ... UInt32(range[1], radix: 16)!
    } else {
      let scalar = UInt32(filteredScalars, radix: 16)!
      
      scalars = scalar ... scalar
    }
    
    let version = components[1].filter { !$0.isWhitespace }
    let parts = version.split(separator: ".")
    
    let major = UInt8(parts[0])!
    let minor = UInt8(parts[1])!
    
    result.append((scalars, [major, minor]))
  }
}

func emitAge(
  data: [(ClosedRange<UInt32>, [UInt8])],
  into result: inout String
) {
  var uniqueAges: Set<[UInt8]> = []
  
  for (_, age) in data {
    uniqueAges.insert(age)
  }
  
  let ages = uniqueAges.map {
    UInt16($0[0]) | (UInt16($0[1]) << 8)
  }
  
  emitCollection(ages, name: "_swift_stdlib_ages_data", into: &result)
  
  emitCollection(
    data,
    name: "_swift_stdlib_ages",
    type: "__swift_uint64_t",
    into: &result
  ) {
    var value: UInt64 = UInt64($0.0.lowerBound)
    
    let age = UInt16($0.1[0]) | (UInt16($0.1[1]) << 8)
    let ageIndex = ages.firstIndex(of: age)!
    
    value |= UInt64(ageIndex) << 21
    
    value |= UInt64($0.0.count - 1) << 32
    
    return "0x\(String(value, radix: 16, uppercase: true))"
  }
}

func generateAgeProp(into result: inout String) {
  let derivedAge = readFile("Data/DerivedAge.txt")
  
  var ageData: [(ClosedRange<UInt32>, [UInt8])] = []
  
  getAge(from: derivedAge, into: &ageData)
  
  emitAge(data: flatten(ageData), into: &result)
}