42 lines
936 B
TypeScript
42 lines
936 B
TypeScript
|
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;
|
||
|
}
|
||
|
}
|