mirror of
https://gitee.com/anod/open_agb_firm.git
synced 2025-05-06 05:44:11 +08:00
不处理注释,将gameinfo分隔的功能放到parser中,提升了些许性能
This commit is contained in:
parent
16f369b956
commit
6562fe4fab
@ -1,5 +1,3 @@
|
|||||||
const readCht = require("./cht");
|
|
||||||
const fs = require("fs");
|
|
||||||
const { readFile, writeFile } = require("fs/promises");
|
const { readFile, writeFile } = require("fs/promises");
|
||||||
const transform = require("./worker");
|
const transform = require("./worker");
|
||||||
|
|
||||||
|
@ -34,15 +34,30 @@ const findIndex = (t, tr, tlen) => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const read = (cht, info, order) => {
|
const read = (cht, info, order) => {
|
||||||
cht = cht.replace(/[-]{4,}/g, "");
|
|
||||||
const size = cht.length;
|
const size = cht.length;
|
||||||
let state = WAIT_LOCK, token = [], line = 1;
|
let state = WAIT_LOCK, token = [], line = 1;
|
||||||
|
|
||||||
let locks = [], currlock = null;
|
let locks = [], currlock = null;
|
||||||
const token_str = () => { let r = String.fromCharCode.apply(String, token); return (token.length = 0, r); }
|
|
||||||
|
const merge_str = String.fromCharCode.bind(String);
|
||||||
|
const token_str = () => { const r = merge_str.apply(null, token); return (token.length = 0, r); }
|
||||||
const error = msg => { throw new SyntaxError(`${msg} at line: ${line} in lock ${currlock?.name}`) }
|
const error = msg => { throw new SyntaxError(`${msg} at line: ${line} in lock ${currlock?.name}`) }
|
||||||
|
|
||||||
|
const next_cht_begin = pos => {
|
||||||
|
for(let i=pos; i < size; ++i ){
|
||||||
|
const ch = cht.charAt(i);
|
||||||
|
if (ch == "\n") {
|
||||||
|
++line;
|
||||||
|
if(cht.charAt(i + 1) == "[")
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return size;
|
||||||
|
}
|
||||||
|
|
||||||
|
const retval = [];
|
||||||
for (let i = 0; i <= size; ++i) {
|
for (let i = 0; i <= size; ++i) {
|
||||||
const ch = i == size ? "" : cht.charAt(i);
|
const ch = cht.charAt(i);
|
||||||
switch (ch) {
|
switch (ch) {
|
||||||
case "[":
|
case "[":
|
||||||
if (state == WAIT_LOCK || state == READ_HOLE) {
|
if (state == WAIT_LOCK || state == READ_HOLE) {
|
||||||
@ -57,8 +72,16 @@ const read = (cht, info, order) => {
|
|||||||
state = WAIT_HOLE;
|
state = WAIT_HOLE;
|
||||||
currlock.name = token_str();
|
currlock.name = token_str();
|
||||||
currlock.holes = [];
|
currlock.holes = [];
|
||||||
if (currlock.name.toLowerCase() == "gameinfo")
|
if (currlock.name.toLowerCase() == "gameinfo"){
|
||||||
i = size; // break;
|
retval.push( lade(locks, info, order) );
|
||||||
|
i = next_cht_begin(i);
|
||||||
|
if( i < size ){
|
||||||
|
state = WAIT_LOCK;
|
||||||
|
token = [];
|
||||||
|
locks = [];
|
||||||
|
currlock = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else error(`error occur ] on ${STATE[state]}`)
|
else error(`error occur ] on ${STATE[state]}`)
|
||||||
break;
|
break;
|
||||||
@ -166,7 +189,7 @@ const read = (cht, info, order) => {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return lade(locks, info, order);
|
return retval;
|
||||||
}
|
}
|
||||||
|
|
||||||
const assembleCheat = (list, dup, hole) => {
|
const assembleCheat = (list, dup, hole) => {
|
||||||
|
@ -3,29 +3,6 @@ const readCht = require("./cht");
|
|||||||
const { readFile, access } = require("fs/promises");
|
const { readFile, access } = require("fs/promises");
|
||||||
const ncpu = require("os").availableParallelism();
|
const ncpu = require("os").availableParallelism();
|
||||||
|
|
||||||
const trimcheat = (dat, info, order) => {
|
|
||||||
let parts = [], start = 0, done = false;
|
|
||||||
while (!done) {
|
|
||||||
let pos = dat.indexOf("[GameInfo]", start);
|
|
||||||
if (pos > 0) {
|
|
||||||
pos = dat.indexOf("[", pos + "[GameInfo]".length);
|
|
||||||
if (pos > 0) {
|
|
||||||
parts.push(dat.slice(start, pos));
|
|
||||||
start = pos;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
parts.push(dat.slice(start, dat.length));
|
|
||||||
done = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
parts.push(dat.slice(start, dat.length));
|
|
||||||
done = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return parts.map(tr => readCht(tr, info, order));
|
|
||||||
}
|
|
||||||
|
|
||||||
const loadcheat = async (order, serial, title, file) => {
|
const loadcheat = async (order, serial, title, file) => {
|
||||||
if( false == await access(file).catch( e => false ) ) {
|
if( false == await access(file).catch( e => false ) ) {
|
||||||
return Promise.resolve();
|
return Promise.resolve();
|
||||||
@ -35,9 +12,7 @@ const loadcheat = async (order, serial, title, file) => {
|
|||||||
const chtfile = await readFile(file);
|
const chtfile = await readFile(file);
|
||||||
const cheats = chtfile.toString("utf-8");
|
const cheats = chtfile.toString("utf-8");
|
||||||
let cheat = null;
|
let cheat = null;
|
||||||
if (cheats.indexOf("[GameInfo]") != cheats.lastIndexOf("[GameInfo]"))
|
cheat = readCht(cheats, { serial }, order);
|
||||||
cheat = trimcheat(cheats, { serial }, order);
|
|
||||||
else cheat = [readCht(cheats, { serial }, order)];
|
|
||||||
return { serial, cheat }
|
return { serial, cheat }
|
||||||
}
|
}
|
||||||
catch (e) {
|
catch (e) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user