Skip to content

Commit 7252a59

Browse files
committed
cleanup parser rules and docs
1 parent 83a1340 commit 7252a59

File tree

6 files changed

+102
-81
lines changed

6 files changed

+102
-81
lines changed

src/InputHandler.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -231,8 +231,7 @@ export class InputHandler extends Disposable implements IInputHandler {
231231
this._parser.setExecuteHandler(C0.SO, () => this.shiftOut());
232232
this._parser.setExecuteHandler(C0.SI, () => this.shiftIn());
233233
// FIXME: What do to with missing? Old code just added those to print.
234-
235-
// some C1 control codes - FIXME: should those be enabled by default?
234+
236235
this._parser.setExecuteHandler(C1.IND, () => this.index());
237236
this._parser.setExecuteHandler(C1.NEL, () => this.nextLine());
238237
this._parser.setExecuteHandler(C1.HTS, () => this.tabSet());

src/common/parser/DcsParser.ts

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,8 @@ import { PAYLOAD_LIMIT } from 'common/parser/Constants';
1212

1313
export class DcsParser implements IDcsParser {
1414
private _handlers: IHandlerCollection<IDcsHandler> = Object.create(null);
15-
private _active: IDcsHandler[] = [];
15+
private _empty: IDcsHandler[] = [];
16+
private _active: IDcsHandler[] = this._empty;
1617
private _ident: number = 0;
1718
private _handlerFb: DcsFallbackHandler = () => {};
1819

@@ -53,13 +54,15 @@ export class DcsParser implements IDcsParser {
5354
if (this._active.length) {
5455
this.unhook(false);
5556
}
56-
this._active = [];
57+
this._active = this._empty;
5758
this._ident = 0;
5859
}
5960

6061
public hook(ident: number, params: IParams): void {
62+
// always reset leftover handlers
63+
this.reset();
6164
this._ident = ident;
62-
this._active = this._handlers[ident] || [];
65+
this._active = this._handlers[ident] || this._empty;
6366
if (!this._active.length) {
6467
this._handlerFb(this._ident, 'HOOK', params);
6568
} else {
@@ -95,7 +98,7 @@ export class DcsParser implements IDcsParser {
9598
this._active[j].unhook(false);
9699
}
97100
}
98-
this._active = [];
101+
this._active = this._empty;
99102
this._ident = 0;
100103
}
101104
}

src/common/parser/EscapeSequenceParser.test.ts

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -279,12 +279,10 @@ describe('EscapeSequenceParser', function (): void {
279279
parser.reset();
280280
for (state in states) {
281281
parser.currentState = state;
282-
parser.osc = '#';
283282
parser.params = [23];
284283
parser.collect = '#';
285284
parse(parser, '\x1b');
286285
chai.expect(parser.currentState).equal(ParserState.ESCAPE);
287-
chai.expect(parser.osc).equal('');
288286
chai.expect(parser.params).eql([0]);
289287
chai.expect(parser.collect).equal('');
290288
parser.reset();
@@ -396,24 +394,20 @@ describe('EscapeSequenceParser', function (): void {
396394
parser.reset();
397395
// C0
398396
parser.currentState = ParserState.ESCAPE;
399-
parser.osc = '#';
400397
parser.params = [123];
401398
parser.collect = '#';
402399
parse(parser, '[');
403400
chai.expect(parser.currentState).equal(ParserState.CSI_ENTRY);
404-
chai.expect(parser.osc).equal('');
405401
chai.expect(parser.params).eql([0]);
406402
chai.expect(parser.collect).equal('');
407403
parser.reset();
408404
// C1
409405
for (state in states) {
410406
parser.currentState = state;
411-
parser.osc = '#';
412407
parser.params = [123];
413408
parser.collect = '#';
414409
parse(parser, '\x9b');
415410
chai.expect(parser.currentState).equal(ParserState.CSI_ENTRY);
416-
chai.expect(parser.osc).equal('');
417411
chai.expect(parser.params).eql([0]);
418412
chai.expect(parser.collect).equal('');
419413
parser.reset();

src/common/parser/EscapeSequenceParser.ts

Lines changed: 27 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -334,24 +334,24 @@ export class EscapeSequenceParser extends Disposable implements IEscapeSequenceP
334334
this._dcsParser.dispose();
335335
}
336336

337-
setPrintHandler(callback: (data: Uint32Array, start: number, end: number) => void): void {
337+
public setPrintHandler(callback: (data: Uint32Array, start: number, end: number) => void): void {
338338
this._printHandler = callback;
339339
}
340-
clearPrintHandler(): void {
340+
public clearPrintHandler(): void {
341341
this._printHandler = this._printHandlerFb;
342342
}
343343

344-
setExecuteHandler(flag: string, callback: () => void): void {
344+
public setExecuteHandler(flag: string, callback: () => void): void {
345345
this._executeHandlers[flag.charCodeAt(0)] = callback;
346346
}
347-
clearExecuteHandler(flag: string): void {
347+
public clearExecuteHandler(flag: string): void {
348348
if (this._executeHandlers[flag.charCodeAt(0)]) delete this._executeHandlers[flag.charCodeAt(0)];
349349
}
350-
setExecuteHandlerFallback(callback: (code: number) => void): void {
350+
public setExecuteHandlerFallback(callback: (code: number) => void): void {
351351
this._executeHandlerFb = callback;
352352
}
353353

354-
addCsiHandler(id: IFunctionIdentifier, callback: CsiHandler): IDisposable {
354+
public addCsiHandler(id: IFunctionIdentifier, callback: CsiHandler): IDisposable {
355355
const ident = this._identifier(id);
356356
if (this._csiHandlers[ident] === undefined) {
357357
this._csiHandlers[ident] = [];
@@ -367,17 +367,17 @@ export class EscapeSequenceParser extends Disposable implements IEscapeSequenceP
367367
}
368368
};
369369
}
370-
setCsiHandler(id: IFunctionIdentifier, callback: (params: IParams) => void): void {
370+
public setCsiHandler(id: IFunctionIdentifier, callback: (params: IParams) => void): void {
371371
this._csiHandlers[this._identifier(id)] = [callback];
372372
}
373-
clearCsiHandler(id: IFunctionIdentifier): void {
373+
public clearCsiHandler(id: IFunctionIdentifier): void {
374374
if (this._csiHandlers[this._identifier(id)]) delete this._csiHandlers[this._identifier(id)];
375375
}
376-
setCsiHandlerFallback(callback: (ident: number, params: IParams) => void): void {
376+
public setCsiHandlerFallback(callback: (ident: number, params: IParams) => void): void {
377377
this._csiHandlerFb = callback;
378378
}
379379

380-
addEscHandler(id: IFunctionIdentifier, callback: EscHandler): IDisposable {
380+
public addEscHandler(id: IFunctionIdentifier, callback: EscHandler): IDisposable {
381381
const ident = this._identifier(id, [0x30, 0x7e]);
382382
if (this._escHandlers[ident] === undefined) {
383383
this._escHandlers[ident] = [];
@@ -393,50 +393,50 @@ export class EscapeSequenceParser extends Disposable implements IEscapeSequenceP
393393
}
394394
};
395395
}
396-
setEscHandler(id: IFunctionIdentifier, callback: () => void): void {
396+
public setEscHandler(id: IFunctionIdentifier, callback: () => void): void {
397397
this._escHandlers[this._identifier(id, [0x30, 0x7e])] = [callback];
398398
}
399-
clearEscHandler(id: IFunctionIdentifier): void {
399+
public clearEscHandler(id: IFunctionIdentifier): void {
400400
if (this._escHandlers[this._identifier(id, [0x30, 0x7e])]) delete this._escHandlers[this._identifier(id, [0x30, 0x7e])];
401401
}
402-
setEscHandlerFallback(callback: (ident: number) => void): void {
402+
public setEscHandlerFallback(callback: (ident: number) => void): void {
403403
this._escHandlerFb = callback;
404404
}
405405

406-
addOscHandler(ident: number, handler: IOscHandler): IDisposable {
406+
public addOscHandler(ident: number, handler: IOscHandler): IDisposable {
407407
return this._oscParser.addOscHandler(ident, handler);
408408
}
409-
setOscHandler(ident: number, handler: IOscHandler): void {
409+
public setOscHandler(ident: number, handler: IOscHandler): void {
410410
this._oscParser.setOscHandler(ident, handler);
411411
}
412-
clearOscHandler(ident: number): void {
412+
public clearOscHandler(ident: number): void {
413413
this._oscParser.clearOscHandler(ident);
414414
}
415-
setOscHandlerFallback(handler: OscFallbackHandler): void {
415+
public setOscHandlerFallback(handler: OscFallbackHandler): void {
416416
this._oscParser.setOscHandlerFallback(handler);
417417
}
418418

419-
addDcsHandler(id: IFunctionIdentifier, handler: IDcsHandler): IDisposable {
419+
public addDcsHandler(id: IFunctionIdentifier, handler: IDcsHandler): IDisposable {
420420
return this._dcsParser.addDcsHandler(this._identifier(id), handler);
421421
}
422-
setDcsHandler(id: IFunctionIdentifier, handler: IDcsHandler): void {
422+
public setDcsHandler(id: IFunctionIdentifier, handler: IDcsHandler): void {
423423
this._dcsParser.setDcsHandler(this._identifier(id), handler);
424424
}
425-
clearDcsHandler(id: IFunctionIdentifier): void {
425+
public clearDcsHandler(id: IFunctionIdentifier): void {
426426
this._dcsParser.clearDcsHandler(this._identifier(id));
427427
}
428-
setDcsHandlerFallback(handler: DcsFallbackHandler): void {
428+
public setDcsHandlerFallback(handler: DcsFallbackHandler): void {
429429
this._dcsParser.setDcsHandlerFallback(handler);
430430
}
431431

432-
setErrorHandler(callback: (state: IParsingState) => IParsingState): void {
432+
public setErrorHandler(callback: (state: IParsingState) => IParsingState): void {
433433
this._errorHandler = callback;
434434
}
435-
clearErrorHandler(): void {
435+
public clearErrorHandler(): void {
436436
this._errorHandler = this._errorHandlerFb;
437437
}
438438

439-
reset(): void {
439+
public reset(): void {
440440
this.currentState = this.initialState;
441441
this._oscParser.reset();
442442
this._dcsParser.reset();
@@ -463,7 +463,7 @@ export class EscapeSequenceParser extends Disposable implements IEscapeSequenceP
463463
* - OSC_STRING:OSC_PUT
464464
* - DCS_PASSTHROUGH:DCS_PUT
465465
*/
466-
parse(data: Uint32Array, length: number): void {
466+
public parse(data: Uint32Array, length: number): void {
467467
let code = 0;
468468
let transition = 0;
469469
let currentState = this.currentState;
@@ -472,7 +472,6 @@ export class EscapeSequenceParser extends Disposable implements IEscapeSequenceP
472472
let collect = this._collect;
473473
const params = this._params;
474474
const table: Uint8Array = this.TRANSITIONS.table;
475-
let callback: Function | null = null;
476475

477476
// process input string
478477
for (let i = 0; i < length; ++i) {
@@ -508,8 +507,7 @@ export class EscapeSequenceParser extends Disposable implements IEscapeSequenceP
508507
}
509508
break;
510509
case ParserAction.EXECUTE:
511-
callback = this._executeHandlers[code];
512-
if (callback) callback();
510+
if (this._executeHandlers[code]) this._executeHandlers[code]();
513511
else this._executeHandlerFb(code);
514512
this.precedingCodepoint = 0;
515513
break;
@@ -581,7 +579,6 @@ export class EscapeSequenceParser extends Disposable implements IEscapeSequenceP
581579
this.precedingCodepoint = 0;
582580
break;
583581
case ParserAction.CLEAR:
584-
osc.reset();
585582
params.reset();
586583
params.addParam(0); // ZDM
587584
collect = 0;
@@ -603,7 +600,6 @@ export class EscapeSequenceParser extends Disposable implements IEscapeSequenceP
603600
case ParserAction.DCS_UNHOOK:
604601
dcs.unhook(code !== 0x18 && code !== 0x1a);
605602
if (code === 0x1b) transition |= ParserState.ESCAPE;
606-
osc.reset();
607603
params.reset();
608604
params.addParam(0); // ZDM
609605
collect = 0;
@@ -625,7 +621,6 @@ export class EscapeSequenceParser extends Disposable implements IEscapeSequenceP
625621
case ParserAction.OSC_END:
626622
osc.end(code !== 0x18 && code !== 0x1a);
627623
if (code === 0x1b) transition |= ParserState.ESCAPE;
628-
osc.reset();
629624
params.reset();
630625
params.addParam(0); // ZDM
631626
collect = 0;
@@ -635,7 +630,7 @@ export class EscapeSequenceParser extends Disposable implements IEscapeSequenceP
635630
currentState = transition & TableAccess.TRANSITION_STATE_MASK;
636631
}
637632

638-
// save non pushable buffers
633+
// save collected intermediates
639634
this._collect = collect;
640635

641636
// save state

src/common/parser/OscParser.ts

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ export class OscParser extends Disposable {
1616
private _handlers: IHandlerCollection<IOscHandler> = Object.create(null);
1717
private _handlerFb: OscFallbackHandler = () => { };
1818

19-
addOscHandler(ident: number, handler: IOscHandler): IDisposable {
19+
public addOscHandler(ident: number, handler: IOscHandler): IDisposable {
2020
if (this._handlers[ident] === undefined) {
2121
this._handlers[ident] = [];
2222
}
@@ -31,13 +31,13 @@ export class OscParser extends Disposable {
3131
}
3232
};
3333
}
34-
setOscHandler(ident: number, handler: IOscHandler): void {
34+
public setOscHandler(ident: number, handler: IOscHandler): void {
3535
this._handlers[ident] = [handler];
3636
}
37-
clearOscHandler(ident: number): void {
37+
public clearOscHandler(ident: number): void {
3838
if (this._handlers[ident]) delete this._handlers[ident];
3939
}
40-
setOscHandlerFallback(handler: OscFallbackHandler): void {
40+
public setOscHandlerFallback(handler: OscFallbackHandler): void {
4141
this._handlerFb = handler;
4242
}
4343

@@ -100,6 +100,8 @@ export class OscParser extends Disposable {
100100
}
101101

102102
public start(): void {
103+
// always reset leftover handlers
104+
this.reset();
103105
this._id = -1;
104106
this._state = OscState.ID;
105107
}

0 commit comments

Comments
 (0)