> -- Иван Горячев писал(а):
> Я тут немного поиздевался над динамическими строками.
Давайте погодим "издеваться", дождёмся, пока появится репозиторий, а то я уже кое-что добавил к подсистемам, а тут пришлось разбираться с версиями. За модуль StringsBase спасибо, я только хотел свой начать воплощать. Планировал заюзать (System)Mem, там как раз есть работа с динамическими массивами и предвыделение памяти.

> -- Иван Горячев писал(а):
> 1422 msec - чтение,  2343 msec - запись по Timed execute, отжирает около 21 метра.
Выполнил простой код, без записи даже:
## Код:
```
t:=Services.Ticks();
doc:=XmlcoreCmds.LoadXMLDocument('Xmlcore/Rsrc/antarctica.svg');
StdLog.String('read ');StdLog.Int(Services.Ticks()-t);
```

Получилось(в среднем) 20 сек., если демка выполняется сразу после запуска среды, и 100 сек., если выполнить демку ещё раз, предварительно выгрузив демо-модуль. Может это из-за тормознутости моей системы (AthlonXP+ 2500 XP, 1024 RAM, WinXP SP2), или неизвестно из-за чего ещё...
Включив запись в файл, так и не дождался окончания...
> -- Иван Горячев писал(а):
> Графического редактора под рукой проверить нет, но Firefox открывает оба, причём отрисовывает немножко по-разному
Ну, я тут в IncScape демки всякие рисовал, потом через Xmlcore пропускал... Всё вроде одно и то же, и редактор не ругался... Размеры файлов меняются на несколько килобайт, но это может происходить из-за смены кодировки, или из-за добавления whitespaces всяких... По крайней мере, валидацию проходят все записанные в последнее время файлы. Валидность файлов проверяю просмотром готового xml-файла в Internet Explorer, он там структуру рисует, если всё верно, или указывает место ошибки.
> -- Иван Горячев писал(а):
> Кстати, запись тоже была с косяком - доже строки.
Да, похоже это как раз то, что я поправил.
> -- Иван Горячев писал(а):
> А автора Basics нужно заставить вручную байты на компьютере персчитыватьАга, точно. Это ж надо умудриться, для добавления символа в строку заниматься её копированием в новую строку...
Код из BasicsDynStrings:
## Код:
```
PROCEDURE AddRight (inoutString: DynString; IN str: ARRAY OF CHAR);
      (* str is added to content of string at the right side. *)
      VAR newString: POINTER TO ARRAY OF CHAR;
   BEGIN
      NEW (newString, LEN (inoutString.content$) + LEN (str$) + 1);
      newString^ := inoutString.content$ + str$;
      inoutString.content := newString
   END AddRight;
```

...и чуть ниже...
## Код:
```
PROCEDURE (string: DynString) AddCharRight* (inChar: CHAR), NEW;
      (* inChar is added at the right side of the content of string. *)
      VAR str: ARRAY 2 OF CHAR;
         oldLength: INTEGER;
   BEGIN
      oldLength := LEN (string.content$);
      str[0] := inChar;
      str[1] := 0X;
      AddRight (string, str);

      (* Post: string.Length = oldString.Length + 1 *)
      Assert.PostStringValid (string.content);
      Assert.PostStringLenOk (LEN (string.content$) = oldLength + 1, string.content$, oldLength + 1)
   END AddCharRight;
```
