Skip to content

Commit b49d4a4

Browse files
authored
Merge pull request #20 from FIXTradingCommunity/LOG-186
#LOG-188
2 parents 8967c62 + 94926c9 commit b49d4a4

File tree

1 file changed

+14
-5
lines changed

1 file changed

+14
-5
lines changed

src/lib/TVFileParser.ts

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
*/
88
export class TVFieldParser {
99
static readonly tagDelimiter: string = "=";
10-
static readonly fieldDelimiter: string = String.fromCharCode(1);
10+
static fieldDelimiter: string = String.fromCharCode(1);
1111
static readonly nullFieldParser: TVFieldParser = new TVFieldParser("", 0);
1212
static lengthFieldIds: Array<string> = new Array<string>();
1313

@@ -17,7 +17,7 @@ export class TVFieldParser {
1717
private valueLength: number = 0;
1818
private nextValueLength: number = 0;
1919

20-
constructor(str: string, offset: number, fieldDelimiter: string = String.fromCharCode(1)) {
20+
constructor(str: string, offset: number) {
2121
this.str = str;
2222
this.tagOffset = offset;
2323
}
@@ -135,8 +135,9 @@ export class TVMessageParser implements Iterator<TVFieldParser> {
135135
// tslint:disable-next-line: max-classes-per-file
136136
export default class TVFileParser implements Iterator<TVMessageParser> {
137137
static readonly messageStartDelimiter: string = "8=FIX";
138-
static readonly checksumTag: string = String.fromCharCode(1) + "10=";
139-
static readonly fieldDelimiter: string = String.fromCharCode(1);
138+
static readonly bodyLengthTag: string = "9=";
139+
static readonly checksumTag: string = "10=";
140+
private fieldDelimiter: string = String.fromCharCode(1);
140141
private messageEndOffset: number = 0;
141142
private str: string = "";
142143
public unprocessedMessages: number = 0;
@@ -154,9 +155,17 @@ export default class TVFileParser implements Iterator<TVMessageParser> {
154155
// find start of the next message using BeginString
155156
const messageStartOffset: number = this.str.indexOf(TVFileParser.messageStartDelimiter, this.messageEndOffset);
156157
if (messageStartOffset !== -1) {
158+
const delimiterCharIndex = this.str.indexOf(TVFileParser.bodyLengthTag, messageStartOffset) - 1;
159+
// find the character before the second field, tag 9. It is the field delimiter in the log file.
160+
if (messageStartOffset !== -1) {
161+
this.fieldDelimiter = this.str.charAt(delimiterCharIndex);
162+
TVFieldParser.fieldDelimiter = this.fieldDelimiter;
163+
} else {
164+
// default to SOH, but give warning
165+
}
157166
const checksumOffset: number = this.str.indexOf(TVFileParser.checksumTag, messageStartOffset);
158167
if (checksumOffset !== -1) {
159-
this.messageEndOffset = this.str.indexOf(TVFileParser.fieldDelimiter, checksumOffset);
168+
this.messageEndOffset = this.str.indexOf(this.fieldDelimiter, checksumOffset);
160169
if (this.messageEndOffset !== -1) {
161170
return {
162171
done: false,

0 commit comments

Comments
 (0)