in patcher/patcher.js [553:645]
function patchHFile(file, patch) {
configkeysH()
let resFile = ""
let inZone = false
let flags = {}
let lineNo = 0
let nums = []
for (let line0 of file.split(/\n/)) {
lineNo++
let append = line0 + "\n"
let line = line0.trim().replace(/\/\/.*/, "")
if (inZone) {
if (line.indexOf("/* CF2 END */") >= 0) {
inZone = false
if (patch) {
let portSize = lookupCfg(patch, configKeys.PINS_PORT_SIZE)
let s = ""
let size = flags["size"] || 100
let numentries = patch.length >> 1
size = Math.max(size, numentries + 4)
s += ` ${CFG_MAGIC0}, ${CFG_MAGIC1}, // magic\n`
s += ` ${numentries}, ${size}, // used entries, total entries\n`
for (let i = 0; i < numentries; ++i) {
let k = patch[i * 2]
let v = patch[i * 2 + 1]
s += ` ${k}, 0x${v.toString(16)}, // ${showKV(k, v, portSize, patch)}\n`
}
s += " "
for (let i = 0; i < size - numentries; ++i) {
if (i && i % 16 == 0)
s += "\n "
s += " 0, 0,"
}
s += "\n"
append = s + line0 + "\n"
}
} else {
append = ""
let toks = line.split(/,\s*/).map(s => s.trim()).filter(s => !!s)
for (let tok of toks) {
let n = parseInt(tok)
if (isNaN(n)) {
n = all_defines[tok]
if (n === undefined) {
let portSize = lookupCfg(nums, configKeys.PINS_PORT_SIZE)
if (portSize) portSize &= 0xfff;
let pp = parsePinName(tok.replace(/^PIN_/, ""), portSize)
if (pp !== undefined) {
n = pp
} else {
err(`unknown value ${tok} at line ${lineNo}`)
}
}
}
nums.push(n)
}
}
} else {
let m = /\/\* CF2 START (.*)/.exec(line)
if (m) {
inZone = true
for (let k of m[1].split(/\s+/)) {
let mm = /^(\w+)=(\d+)$/.exec(k)
if (mm)
flags[mm[1]] = parseInt(mm[2])
else
flags[k] = true
}
}
}
resFile += append
}
if (nums.length) {
if (nums[0] != CFG_MAGIC0 || nums[1] != CFG_MAGIC1)
err("no magic in H file")
nums = nums.slice(4)
for (let i = 0; i < nums.length; i += 2) {
if (nums[i] == 0) {
if (nums.slice(i).some(x => x != 0))
err("config keys follow zero terminator")
else
nums = nums.slice(0, i)
break
}
}
}
return {
patched: resFile,
data: nums
}
}