Автор Тема: Какая кодировка у BB документов?  (Прочитано 45035 раз)

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Какая кодировка у BB документов?
« : Декабрь 19, 2012, 04:33:33 pm »
Думал что UTF-8. А оказалось:
Цитировать
PROCEDURE (wr: StdWriter) WriteChar (ch: CHAR);
        VAR t: StdModel; u, un: Run; lp: LPiece; pos, spillPos: INTEGER;
            fw: Files.Writer; op: EditOp; bunch: BOOLEAN;
    BEGIN
        IF (ch >= 20X) & (ch < 7FX)
        OR (ch = tab) OR (ch = line) OR (ch = para)
        OR (ch = zwspace) OR (ch = digitspace)
        OR (ch = hyphen) OR (ch = nbhyphen) OR (ch >= 0A0X) & (ch < 100X) THEN
            WriteSChar(wr, SHORT(ch))    (* could inline! *)
        ELSIF ch = 200BX THEN wr.WriteChar(zwspace)
        ELSIF ch = 2010X THEN wr.WriteChar(hyphen)
        ELSIF ch = 2011X THEN wr.WriteChar(nbhyphen)
        ELSIF ch >= 100X THEN
            t := wr.base; pos := wr.pos;
            IF t.spill.file = NIL THEN OpenSpill(t.spill) END;
            fw := t.spill.writer;
            fw.WriteByte(SHORT(SHORT(ORD(ch))));
            fw.WriteByte(SHORT(SHORT(ORD(ch) DIV 256 - 128)));

            spillPos := t.spill.len; t.spill.len := spillPos + 2;
            IF (t.Domain() = NIL) OR (t.Domain().GetSequencer() = NIL) THEN
                (* optimized for speed - writing to unbound text *)
                InvalCache(t, pos);
                IF wr.era # t.era THEN WriterReset(wr) END;
                un := wr.run; u := un.prev;
                IF (u.attr # NIL) & u.attr.Equals(wr.attr) & (u IS LPiece) & ~(u IS Piece) & (u(LPiece).file = t.spill.file)
                & (u(LPiece).org + 2 * u.len = spillPos) THEN
                    INC(u.len);
                    IF t.pc.org >= pos THEN INC(t.pc.org) END
                ELSE
                    NEW(lp); u.next := lp; lp.prev := u; lp.next := un; un.prev := lp;
                    lp.len := 1; lp.attr := wr.attr;
                    lp.file := t.spill.file; lp.org := spillPos;
                    IF t.pc.org > pos THEN INC(t.pc.org) END;
                    IF ~Stores.Joined(t, lp.attr) THEN
                        IF ~Stores.Unattached(lp.attr) THEN lp.attr := Stores.CopyOf(lp.attr)(Attributes) END;
                        Stores.Join(t, lp.attr)
                    END
                END;
                INC(t.era); INC(t.len);
                INC(wr.era)
            ELSE
                GetWriteOp(t, pos, op, bunch);
                IF (op.attr = NIL) OR ~op.attr.Equals(wr.attr) THEN op.attr := wr.attr END;
                op.mode := writeChar; (*op.attr := wr.attr;*) op.len := spillPos;
                IF bunch THEN Models.Bunch(t) ELSE Models.Do(t, "#System:Inserting", op) END
            END;
            wr.pos := pos + 1
        END
    END WriteChar;

Че эт за манипуляция?

Илья Ермаков

  • Sr. Member
  • ****
  • Сообщений: 493
    • Просмотр профиля
Re: Какая кодировка у BB документов?
« Ответ #1 : Декабрь 19, 2012, 04:36:29 pm »
Там документ разбивается на "писы" - и "пис" может быть либо в однобайтной кодировке, либо в двубайтной. Смысл -128 не разъясню с лёту.

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Какая кодировка у BB документов?
« Ответ #2 : Декабрь 19, 2012, 04:41:16 pm »
Тык тут вроде не либо-либо. А именно плавающее количество байт насколько я понимаю.  ???

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Какая кодировка у BB документов?
« Ответ #3 : Декабрь 19, 2012, 09:28:27 pm »
Однако тут какое-то хитрожопое кодирование целых чисел.

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Какая кодировка у BB документов?
« Ответ #4 : Декабрь 20, 2012, 06:36:27 am »
Однако тут какое-то хитрожопое кодирование целых чисел.

Опять же в компайлере юзаются:
    (* utf8 strings *)
   
    PROCEDURE PutUtf8* (VAR str: ARRAY OF SHORTCHAR; val: INTEGER; VAR idx: INTEGER);
    BEGIN
        ASSERT((val >= 0) & (val < 65536));
        IF val < 128 THEN
            str[idx] := SHORT(CHR(val)); INC(idx)
        ELSIF val < 2048 THEN
            str[idx] := SHORT(CHR(val DIV 64 + 192)); INC(idx);
            str[idx] := SHORT(CHR(val MOD 64 + 128)); INC(idx)
        ELSE
            str[idx] := SHORT(CHR(val DIV 4096 + 224)); INC(idx);
            str[idx] := SHORT(CHR(val DIV 64 MOD 64 + 128)); INC(idx);
            str[idx] := SHORT(CHR(val MOD 64 + 128)); INC(idx)
        END
    END PutUtf8;
   
    PROCEDURE GetUtf8* (VAR str: ARRAY OF SHORTCHAR; VAR val, idx: INTEGER);
        VAR ch: SHORTCHAR;
    BEGIN
        ch := str[idx]; INC(idx);
        IF ch < 80X THEN
            val := ORD(ch)
        ELSIF ch < 0E0X THEN
            val := ORD(ch) - 192;
            ch := str[idx]; INC(idx); val := val * 64 + ORD(ch) - 128
        ELSE
            val := ORD(ch) - 224;
            ch := str[idx]; INC(idx); val := val * 64 + ORD(ch) - 128;
            ch := str[idx]; INC(idx); val := val * 64 + ORD(ch) - 128
        END
    END GetUtf8;

Ничего не понимаю...

Geniepro

  • Hero Member
  • *****
  • Сообщений: 1955
  • Знайте- истина в том, что повторено трижды подряд!
    • Просмотр профиля
Re: Какая кодировка у BB документов?
« Ответ #5 : Декабрь 20, 2012, 06:36:58 am »
И как обычно нет комментариев )))
Вот вам и эталонный код от професси-анальных оберонщегов...
to iterate is human, to recurse, divine

Салат «рекурсия»: помидоры, огурцы, салат…

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Какая кодировка у BB документов?
« Ответ #6 : Декабрь 20, 2012, 06:48:19 am »
И как обычно нет комментариев )))

Да. Удивительно как они сами свой код понимают.

Илья Ермаков

  • Sr. Member
  • ****
  • Сообщений: 493
    • Просмотр профиля
Re: Какая кодировка у BB документов?
« Ответ #7 : Декабрь 20, 2012, 08:43:01 am »
У них есть своя внутренняя документация, которую они не публикуют.

P.S. Комментарии в коде - это плохо. Должно лежать "сбоку" пояснение по всем моментам, почему, что и как решено.

Кроме того, при разработке ограниченным кругом не ставится задача облегчить любому из N заинтересованных посторонних лиц внесения интересующего его изменения с минимальными трудозатратами.
В стиле "захотел поменять - полез в нужное место - не понимая всего, понял только его - поменял - ура".
Предполагается, что общая модель системы загружена в голову.
Когда мне понадобился Kernel, я за пару дней сложил в голове такую модель...
« Последнее редактирование: Декабрь 20, 2012, 08:47:39 am от Илья Ермаков »

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Какая кодировка у BB документов?
« Ответ #8 : Декабрь 20, 2012, 08:49:22 am »
Там документ разбивается на "писы" - и "пис" может быть либо в однобайтной кодировке, либо в двубайтной. Смысл -128 не разъясню с лёту.

Действительно. В разных писах разное число байт на символ:
Цитировать
PROCEDURE (rd: StdReader) Read;
        VAR t: StdModel; u: Run; n, pos, len: INTEGER; lc: ARRAY 2 OF BYTE;
    BEGIN
        t := rd.base;
        n := t.id MOD cacheWidth;
        IF rd.era # t.era THEN Reset(rd) END;
        u := rd.run;
        WITH u: Piece DO
            rd.attr := u.attr;
            pos := rd.pos MOD cacheLen;
            IF ~((cache[n].id = t.id) & (cache[n].beg <= rd.pos) & (rd.pos < cache[n].end)) THEN
                (* cache miss *)
                IF cache[n].id # t.id THEN cache[n].id := t.id; cache[n].beg := 0; cache[n].end := 0 END;
                len := cacheLine;
                IF len > cacheLen - pos THEN len := cacheLen - pos END;
                IF len > u.len - rd.off THEN len := u.len - rd.off END;
                rd.reader := u.file.NewReader(rd.reader); rd.reader.SetPos(u.org + rd.off);
                rd.reader.ReadBytes(cache[n].buf, pos, len);
                IF rd.pos = cache[n].end THEN
cache[n].end := rd.pos + len;
(*
                    INC(cache[n].end, len);
*)
                    IF cache[n].end - cache[n].beg >= cacheLen THEN
                        cache[n].beg := cache[n].end - (cacheLen - 1)
                    END
                ELSE cache[n].beg := rd.pos; cache[n].end := rd.pos + len
                END
            END;
            rd.char := CHR(cache[n].buf[pos] MOD 256); rd.view := NIL;
            INC(rd.pos); INC(rd.off);
            IF rd.off = u.len THEN rd.run := u.next; rd.off := 0 END
        | u: LPiece DO    (* ~(u IS Piece) *)
            rd.attr := u.attr;
            rd.reader := u.file.NewReader(rd.reader); rd.reader.SetPos(u.org + rd.off * 2);
            rd.reader.ReadBytes(lc, 0, 2);
            rd.char := CHR(lc[0] MOD 256 + 256 * (lc[1] + 128)); rd.view := NIL;
            IF (cache[n].id = t.id) & (rd.pos = cache[n].end) THEN
cache[n].end := cache[n].end + 1;
IF cache[n].end - cache[n].beg >= cacheLen THEN cache[n].beg := cache[n].beg + 1 END;
(*
                INC(cache[n].end);
                IF cache[n].end - cache[n].beg >= cacheLen THEN INC(cache[n].beg) END
*)
            END;
            INC(rd.pos); INC(rd.off);
            IF rd.off = u.len THEN rd.run := u.next; rd.off := 0 END
        | u: ViewRef DO
            rd.attr := u.attr;
            rd.view := u.view; rd.w := u.w; rd.h := u.h; RemapView(rd);
            IF (cache[n].id = t.id) & (rd.pos = cache[n].end) THEN
cache[n].end := cache[n].end + 1;
IF cache[n].end - cache[n].beg >= cacheLen THEN cache[n].beg := cache[n].beg + 1 END;
(*
                INC(cache[n].end);
                IF cache[n].end - cache[n].beg >= cacheLen THEN INC(cache[n].beg) END
*)
            END;
            INC(rd.pos); rd.run := u.next; rd.off := 0
        ELSE
            rd.eot := TRUE; rd.attr := NIL; rd.char := 0X; rd.view := NIL
        END
    END Read;

Но суть изврата мне не ясна.

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Какая кодировка у BB документов?
« Ответ #9 : Декабрь 20, 2012, 09:04:15 am »
У них есть своя внутренняя документация, которую они не публикуют.

P.S. Комментарии в коде - это плохо. Должно лежать "сбоку" пояснение по всем моментам, почему, что и как решено.

Кроме того, при разработке ограниченным кругом не ставится задача облегчить любому из N заинтересованных посторонних лиц внесения интересующего его изменения с минимальными трудозатратами.
В стиле "захотел поменять - полез в нужное место - не понимая всего, понял только его - поменял - ура".
Предполагается, что общая модель системы загружена в голову.
Когда мне понадобился Kernel, я за пару дней сложил в голове такую модель...

Странно.... У меня и у моих коллег представления ровно наоборот.
Внешняя документация - это конечно замечательно, вот только на ее поддержку ресурсов практически никогда нет в реале. Поддерживать актуальность комментариев значительно проще. Да и написать комментарий кодеру проще. А для написания полноценной документации обычно нужен отдельный чел, у которого голова не забита текущими кодерскими задачами. Одно не исключает другое, а дополняет.
Читать код без комментариев противно. Писать код без комментариев непрофессионально.
Помнить весь свой код нереально. Я забываю иногда что вчера писал в аврале.

Цитировать
Кроме того, при разработке ограниченным кругом не ставится задача облегчить любому из N заинтересованных посторонних лиц внесения интересующего его изменения с минимальными трудозатратами.
А это вообще парадоксальное высказывание. На мой взгляд это самая главная задача (облегчить) при написании кода, ибо разработчики меняются даже в одной команде иногда даже чуть менее чем полностью.

Илья Ермаков

  • Sr. Member
  • ****
  • Сообщений: 493
    • Просмотр профиля
Re: Какая кодировка у BB документов?
« Ответ #10 : Декабрь 20, 2012, 10:45:37 am »
Я не оправдываю стиль написания кода ББ-шных разработчиков. Они, видимо, попали в частый соблазн - когда хорошо спроектируешь интерфейсы, то думаешь, что "а похрен, что там и как внутри у этого кирпича будет". Не говоря про то, что идеи, бродившие в начале 90-х, были полностью "зациклены" на двоичной компонентности, при сокрытии исходного кода.

Я сам стремлюсь писать ясный и хорошо декомпонированный код, но обычно этого достигаю "расслаиванием" функционала по многим объектам-кубикам. Т.е. то, что тут уложено в один модуль TextModels, я бы расслоил слоя на три минимум.
НО: я таки однозначно придерживаюсь принципа - "найди способ выразить мысль ясно напрямую кодом без комментариев". И только самые принципиальные нюансы (почему выбран именно такой, неочевидный, алгоритм, или почему такой формат, или какая "засада" встретилась при взаимодействии с внешним миром и как она было обойдена) пояснять в документации на реализацию. Это может быть, например, один большой комментарий без привязки к конкретному куску кода. Ну или пара-тройка комментариев по критичным местам.

Цитировать
Читать код без комментариев противно.
Вот, поймите меня правильно, я за то, чтобы шлифовать код (и разбивать на части функциональность) до той стадии, чтобы его не было противно читать без комментариев.  Это на пользу и архитектуре, и каждому куску кода.
« Последнее редактирование: Декабрь 20, 2012, 10:47:21 am от Илья Ермаков »

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Какая кодировка у BB документов?
« Ответ #11 : Декабрь 20, 2012, 11:24:20 am »
Мы с вами несколько по разному смотрим на код видимо. Я считаю что без комментариев противно читать любой код, независимо от его качества. Дело в том, что восприятие у всех разное, и представления о простом коде тоже разные.
Т.е. это все субъективно.
Вот, например, 1с-никам нравятся длинные названия переменных, т.к. можно по одному названию догадаться какой у нее тип и какое назначение. У нас не принято называть переменные одним/двумя символами - это считается злом, т.к. увеличивает время распознавания чужого кода. Мне довольно тяжело читать BB-шный код, т.к.  приходится смотреть где и как используется переменная, чтобы понять зачем она нужна. На чтение и понимание 500 строк из BB у меня уходит примерно столько же времени как на чтение 10000 строк из 1С. Проф деформация, да... Но с этим нужно считаться.
А вот valexey'ю 1с-ный код мозг заворачивает, ибо он привык к более лаконичному написанию.
Ну и индивидуальные различия у людей тоже и психологические и интеллектуальные, да и образование разное. То, что доктору наук кажется элементарным, для простого смертного окажется головоломкой.
Всегда нужно учитывать что есть люди тупее чем вы, как бы это странно не звучало. У всех разные способности.

Единственное, что может восприниматься более-менее одинаково - это хороший коммент.
Вот что мешает добавить в код пару слов о том, какой метод использован? Вот приписали бы разработчики BB что в данном месте символ кодируется методом JIS X 0208 к примеру, и вопросов бы не было, и я не пялился бы два дня в этот код и не гуглил бы всемирную помойку в поисках ответа.

Илья Ермаков

  • Sr. Member
  • ****
  • Сообщений: 493
    • Просмотр профиля
Re: Какая кодировка у BB документов?
« Ответ #12 : Декабрь 20, 2012, 12:31:39 pm »
Я понимаю Вашу позицию, но позволю себе с ней не согласиться :)
Нужно искать возможность выражать мысль формально кодом.
Когда пытаешься, начинаешь быть внимательным к каждой мелочи (раньше казалось всё равно, записать так или иначе - а потом начинаешь придерживаться конкретного варианта).
Когда язык строгого стиля и не особо допускает многовариантности, то в итоге происходит некий спуск к некому единому стилю выражения мысли в коде. Когда код становится состоящим из узнаваемых "образцов" (тут во мне таки говорит методист, думающий о работе с уже наученными в едином стиле программистами :) ).

Т.е. хороший код без комментариев заставляет быть внимательным к своему смыслу.

Geniepro

  • Hero Member
  • *****
  • Сообщений: 1955
  • Знайте- истина в том, что повторено трижды подряд!
    • Просмотр профиля
Re: Какая кодировка у BB документов?
« Ответ #13 : Декабрь 20, 2012, 12:51:11 pm »
Вот приписали бы разработчики BB что в данном месте символ кодируется методом JIS X 0208 к примеру, и вопросов бы не было, и я не пялился бы два дня в этот код и не гуглил бы всемирную помойку в поисках ответа.
JIS X 0208 -- это какой-то японский стандарт. Блекбоксёры решили этим стандартом кодировать иероглифы всякие? а почему не взяли UTF8, например? Он был разработан в 1992 г., неужели блекбоксёры не знали про него, когда делали юникодную версию блекбокса (1.6)?
to iterate is human, to recurse, divine

Салат «рекурсия»: помидоры, огурцы, салат…

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Какая кодировка у BB документов?
« Ответ #14 : Декабрь 20, 2012, 12:54:13 pm »
2 Илья
Согласен. Но не совсем. К стилю нужно привыкать, а он у каждого разработчика разный в любом случае. Т.е. в теории я с вами согласен, но на практике это сомнительно. Без комментариев придется читать код полностью чтобы понять. А зачем его полностью читать, если меня интересует только интерфейс (в широком смысле)? Почему я должен тратить на это время?

Код написанный формально, хорош для понимания логики работы в конкретном месте. Но логика работы и смысл - это не одно и то же.

Вот посмортите:
Run = POINTER TO EXTENSIBLE RECORD
    prev, next: Run;
    len: INTEGER;
    attr: Attributes
END;

LPiece = POINTER TO EXTENSIBLE RECORD (Run)
    file: Files.File;
    org: INTEGER
END;

Piece = POINTER TO RECORD (LPiece) END;    (* u IS Piece => CHAR run *)

ViewRef = POINTER TO RECORD (Run)    (* u IS ViewRef => View run *)
    w, h: INTEGER;
    view: Views.View    (* embedded view *)
END;
Как это устроено я понимаю. Но что такое LPiece и зачем оно нужно не врубаюсь. И меня дико бесит волшебный префикс "L". Что он значит?
Представьте себе что у Piece и ViewRef тоже нет комментов. Чуйствуете сколько полезной информации сразу пропадет?