syndicate-js/packages/compiler/src/syntax/position.ts

45 lines
1.1 KiB
TypeScript

/// SPDX-License-Identifier: GPL-3.0-or-later
/// SPDX-FileCopyrightText: Copyright © 2016-2021 Tony Garnock-Jones <tonyg@leastfixedpoint.com>
export interface Pos {
line: number;
column: number;
pos: number;
name: string | null;
fixed?: boolean;
}
export function startPos(name: string | null): Pos {
return { line: 1, column: 0, pos: 0, name };
}
export function fixPos(p: Pos): Pos {
return { ... p, fixed: true };
}
export function advancePos(p: Pos, ch: string): boolean {
if (p.fixed ?? false) {
return ch === '\n';
} else {
let advancedLine = false;
p.pos++;
switch (ch) {
case '\t':
p.column = (p.column + 8) & ~7;
break;
case '\n':
p.column = 0;
p.line++;
advancedLine = true;
break;
case '\r':
p.column = 0;
break;
default:
p.column++;
break;
}
return advancedLine;
}
}