xref: /aosp_15_r20/external/pigweed/pw_tokenizer/ts/token_database.ts (revision 61c4878ac05f98d0ceed94b57d316916de578985)
1*61c4878aSAndroid Build Coastguard Worker// Copyright 2022 The Pigweed Authors
2*61c4878aSAndroid Build Coastguard Worker//
3*61c4878aSAndroid Build Coastguard Worker// Licensed under the Apache License, Version 2.0 (the "License"); you may not
4*61c4878aSAndroid Build Coastguard Worker// use this file except in compliance with the License. You may obtain a copy of
5*61c4878aSAndroid Build Coastguard Worker// the License at
6*61c4878aSAndroid Build Coastguard Worker//
7*61c4878aSAndroid Build Coastguard Worker//     https://www.apache.org/licenses/LICENSE-2.0
8*61c4878aSAndroid Build Coastguard Worker//
9*61c4878aSAndroid Build Coastguard Worker// Unless required by applicable law or agreed to in writing, software
10*61c4878aSAndroid Build Coastguard Worker// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
11*61c4878aSAndroid Build Coastguard Worker// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
12*61c4878aSAndroid Build Coastguard Worker// License for the specific language governing permissions and limitations under
13*61c4878aSAndroid Build Coastguard Worker// the License.
14*61c4878aSAndroid Build Coastguard Worker
15*61c4878aSAndroid Build Coastguard Worker/** Parses CSV Database for easier lookups */
16*61c4878aSAndroid Build Coastguard Worker
17*61c4878aSAndroid Build Coastguard Workerexport class TokenDatabase {
18*61c4878aSAndroid Build Coastguard Worker  private tokens: Map<number, string> = new Map();
19*61c4878aSAndroid Build Coastguard Worker
20*61c4878aSAndroid Build Coastguard Worker  constructor(readonly csv: string) {
21*61c4878aSAndroid Build Coastguard Worker    this.parseTokensToTokensMap(csv.split(/\r?\n/));
22*61c4878aSAndroid Build Coastguard Worker  }
23*61c4878aSAndroid Build Coastguard Worker
24*61c4878aSAndroid Build Coastguard Worker  has(token: number): boolean {
25*61c4878aSAndroid Build Coastguard Worker    return this.tokens.has(token);
26*61c4878aSAndroid Build Coastguard Worker  }
27*61c4878aSAndroid Build Coastguard Worker
28*61c4878aSAndroid Build Coastguard Worker  get(token: number): string | undefined {
29*61c4878aSAndroid Build Coastguard Worker    return this.tokens.get(token);
30*61c4878aSAndroid Build Coastguard Worker  }
31*61c4878aSAndroid Build Coastguard Worker
32*61c4878aSAndroid Build Coastguard Worker  private parseTokensToTokensMap(csv: string[]) {
33*61c4878aSAndroid Build Coastguard Worker    for (const [lineNumber, line] of Object.entries(
34*61c4878aSAndroid Build Coastguard Worker      csv.map((line) => line.split(/,/)),
35*61c4878aSAndroid Build Coastguard Worker    )) {
36*61c4878aSAndroid Build Coastguard Worker      if (!line[0] || !line[2]) {
37*61c4878aSAndroid Build Coastguard Worker        continue;
38*61c4878aSAndroid Build Coastguard Worker      }
39*61c4878aSAndroid Build Coastguard Worker      if (!/^[a-fA-F0-9]+$/.test(line[0])) {
40*61c4878aSAndroid Build Coastguard Worker        // Malformed number
41*61c4878aSAndroid Build Coastguard Worker        console.error(
42*61c4878aSAndroid Build Coastguard Worker          new Error(
43*61c4878aSAndroid Build Coastguard Worker            `TokenDatabase number ${line[0]} at line ` +
44*61c4878aSAndroid Build Coastguard Worker              `${lineNumber} is not a valid hex number`,
45*61c4878aSAndroid Build Coastguard Worker          ),
46*61c4878aSAndroid Build Coastguard Worker        );
47*61c4878aSAndroid Build Coastguard Worker        continue;
48*61c4878aSAndroid Build Coastguard Worker      }
49*61c4878aSAndroid Build Coastguard Worker      const tokenNumber = parseInt(line[0], 16);
50*61c4878aSAndroid Build Coastguard Worker      // To extract actual string value of a token number, we:
51*61c4878aSAndroid Build Coastguard Worker      // - Slice token number and whitespace that are in [0] and [1] of line.
52*61c4878aSAndroid Build Coastguard Worker      // - Join the rest as a string and trim the trailing quotes.
53*61c4878aSAndroid Build Coastguard Worker      const data = line.slice(2).join(',').slice(1, -1);
54*61c4878aSAndroid Build Coastguard Worker      this.tokens.set(tokenNumber, data);
55*61c4878aSAndroid Build Coastguard Worker    }
56*61c4878aSAndroid Build Coastguard Worker  }
57*61c4878aSAndroid Build Coastguard Worker}
58