iTextSharp.text.pdf.BarcodePDF417.BreakString C# (CSharp) Метод

BreakString() приватный Метод

private BreakString ( ) : void
Результат void
        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';
            }
        }