internal void BreakString() {
int textLength = text.Length;
int lastP = 0;
int startN = 0;
int nd = 0;
char c = (char)0;
int k, j;
bool lastTxt, txt;
Segment v;
Segment vp;
Segment vn;
if ((options & PDF417_FORCE_BINARY) != 0) {
segmentList.Add('B', 0, textLength);
return;
}
for (k = 0; k < textLength; ++k) {
c = (char)(text[k] & 0xff);
if (c >= '0' && c <= '9') {
if (nd == 0)
startN = k;
++nd;
continue;
}
if (nd >= 13) {
if (lastP != startN) {
c = (char)(text[lastP] & 0xff);
lastTxt = (c >= ' ' && c < 127) || c == '\r' || c == '\n' || c == '\t';
for (j = lastP; j < startN; ++j) {
c = (char)(text[j] & 0xff);
txt = (c >= ' ' && c < 127) || c == '\r' || c == '\n' || c == '\t';
if (txt != lastTxt) {
segmentList.Add(lastTxt ? 'T' : 'B', lastP, j);
lastP = j;
lastTxt = txt;
}
}
segmentList.Add(lastTxt ? 'T' : 'B', lastP, startN);
}
segmentList.Add('N', startN, k);
lastP = k;
}
nd = 0;
}
if (nd < 13)
startN = textLength;
if (lastP != startN) {
c = (char)(text[lastP] & 0xff);
lastTxt = (c >= ' ' && c < 127) || c == '\r' || c == '\n' || c == '\t';
for (j = lastP; j < startN; ++j) {
c = (char)(text[j] & 0xff);
txt = (c >= ' ' && c < 127) || c == '\r' || c == '\n' || c == '\t';
if (txt != lastTxt) {
segmentList.Add(lastTxt ? 'T' : 'B', lastP, j);
lastP = j;
lastTxt = txt;
}
}
segmentList.Add(lastTxt ? 'T' : 'B', lastP, startN);
}
if (nd >= 13)
segmentList.Add('N', startN, textLength);
//optimize
//merge short binary
for (k = 0; k < segmentList.Size; ++k) {
v = segmentList.Get(k);
vp = segmentList.Get(k - 1);
vn = segmentList.Get(k + 1);
if (CheckSegmentType(v, 'B') && GetSegmentLength(v) == 1) {
if (CheckSegmentType(vp, 'T') && CheckSegmentType(vn, 'T')
&& GetSegmentLength(vp) + GetSegmentLength(vn) >= 3) {
vp.end = vn.end;
segmentList.Remove(k);
segmentList.Remove(k);
k = -1;
continue;
}
}
}
//merge text sections
for (k = 0; k < segmentList.Size; ++k) {
v = segmentList.Get(k);
vp = segmentList.Get(k - 1);
vn = segmentList.Get(k + 1);
if (CheckSegmentType(v, 'T') && GetSegmentLength(v) >= 5) {
bool redo = false;
if ((CheckSegmentType(vp, 'B') && GetSegmentLength(vp) == 1) || CheckSegmentType(vp, 'T')) {
redo = true;
v.start = vp.start;
segmentList.Remove(k - 1);
--k;
}
if ((CheckSegmentType(vn, 'B') && GetSegmentLength(vn) == 1) || CheckSegmentType(vn, 'T')) {
redo = true;
v.end = vn.end;
segmentList.Remove(k + 1);
}
if (redo) {
k = -1;
continue;
}
}
}
//merge binary sections
for (k = 0; k < segmentList.Size; ++k) {
v = segmentList.Get(k);
vp = segmentList.Get(k - 1);
vn = segmentList.Get(k + 1);
if (CheckSegmentType(v, 'B')) {
bool redo = false;
if ((CheckSegmentType(vp, 'T') && GetSegmentLength(vp) < 5) || CheckSegmentType(vp, 'B')) {
redo = true;
v.start = vp.start;
segmentList.Remove(k - 1);
--k;
}
if ((CheckSegmentType(vn, 'T') && GetSegmentLength(vn) < 5) || CheckSegmentType(vn, 'B')) {
redo = true;
v.end = vn.end;
segmentList.Remove(k + 1);
}
if (redo) {
k = -1;
continue;
}
}
}
// check if all numbers
if (segmentList.Size == 1 && (v = segmentList.Get(0)).type == 'T' && GetSegmentLength(v) >= 8) {
for (k = v.start; k < v.end; ++k) {
c = (char)(text[k] & 0xff);
if (c < '0' || c > '9')
break;
}
if (k == v.end)
v.type = 'N';
}
}