Skip to content

Commit 8a5a032

Browse files
committed
New method _linkHandler used by both addCsiHandler and addOscHandler.
1 parent 5af4626 commit 8a5a032

File tree

1 file changed

+27
-33
lines changed

1 file changed

+27
-33
lines changed

src/EscapeSequenceParser.ts

Lines changed: 27 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,10 @@ import { ParserState, ParserAction, IParsingState, IDcsHandler, IEscapeSequenceP
77
import { IDisposable } from 'xterm';
88
import { Disposable } from './common/Lifecycle';
99

10+
interface IHandlerLink extends IDisposable {
11+
nextHandler: IHandlerLink | null;
12+
}
13+
1014
/**
1115
* Returns an array filled with numbers between the low and high parameters (right exclusive).
1216
* @param low The low number.
@@ -304,33 +308,38 @@ export class EscapeSequenceParser extends Disposable implements IEscapeSequenceP
304308
this._executeHandlerFb = callback;
305309
}
306310

307-
addCsiHandler(flag: string, callback: (params: number[], collect: string) => boolean): IDisposable {
308-
const index = flag.charCodeAt(0);
309-
const oldHead = this._csiHandlers[index];
310-
const parser = this;
311-
const newHead =
312-
(params: number[], collect: string): void => {
313-
if (! callback(params, collect)) {
314-
if (newHead.nextHandler) { newHead.nextHandler(params, collect); }
315-
else { this._csiHandlerFb(collect, params, index); }
316-
}
317-
};
318-
newHead.nextHandler = oldHead;
311+
private _linkHandler(handlers: object[], index: number, newCallback: object): IDisposable {
312+
const newHead: any = newCallback;
313+
newHead.nextHandler = handlers[index] as IHandlerLink;
319314
newHead.dispose = function (): void {
320-
let previous = null; let cur = parser._csiHandlers[index];
315+
let previous = null;
316+
let cur = handlers[index] as IHandlerLink;
321317
for (; cur && cur.nextHandler;
322318
previous = cur, cur = cur.nextHandler) {
323319
if (cur === newHead) {
324320
if (previous) { previous.nextHandler = cur.nextHandler; }
325-
else { parser._csiHandlers[index] = cur.nextHandler; }
321+
else { handlers[index] = cur.nextHandler; }
326322
break;
327323
}
328324
}
329325
};
330-
this._csiHandlers[index] = newHead;
326+
handlers[index] = newHead;
331327
return newHead;
332328
}
333329

330+
addCsiHandler(flag: string, callback: (params: number[], collect: string) => boolean): IDisposable {
331+
const index = flag.charCodeAt(0);
332+
const newHead =
333+
(params: number[], collect: string): void => {
334+
if (! callback(params, collect)) {
335+
const next = (newHead as unknown as IHandlerLink).nextHandler;
336+
if (next) { (next as any)(params, collect); }
337+
else { this._csiHandlerFb(collect, params, index); }
338+
}
339+
};
340+
return this._linkHandler(this._csiHandlers, index, newHead);
341+
}
342+
334343
setCsiHandler(flag: string, callback: (params: number[], collect: string) => void): void {
335344
this._csiHandlers[flag.charCodeAt(0)] = callback;
336345
}
@@ -352,30 +361,15 @@ export class EscapeSequenceParser extends Disposable implements IEscapeSequenceP
352361
}
353362

354363
addOscHandler(ident: number, callback: (data: string) => boolean): IDisposable {
355-
const oldHead = this._oscHandlers[ident];
356-
const parser = this;
357364
const newHead =
358365
(data: string): void => {
359366
if (! callback(data)) {
360-
if (newHead.nextHandler) { newHead.nextHandler(data); }
367+
const next = (newHead as unknown as IHandlerLink).nextHandler;
368+
if (next) { (next as any)(data); }
361369
else { this._oscHandlerFb(ident, data); }
362370
}
363371
};
364-
newHead.nextHandler = oldHead;
365-
newHead.dispose =
366-
function (): void {
367-
let previous = null; let cur = parser._oscHandlers[ident];
368-
for (; cur && cur.nextHandler;
369-
previous = cur, cur = cur.nextHandler) {
370-
if (cur === newHead) {
371-
if (previous) { previous.nextHandler = cur.nextHandler; }
372-
else { parser._oscHandlers[ident] = cur.nextHandler; }
373-
break;
374-
}
375-
}
376-
};
377-
this._oscHandlers[ident] = newHead;
378-
return newHead;
372+
return this._linkHandler(this._oscHandlers, ident, newHead);
379373
}
380374
setOscHandler(ident: number, callback: (data: string) => void): void {
381375
this._oscHandlers[ident] = callback;

0 commit comments

Comments
 (0)