include 'D:/kos.git/kolibrios/programs/macros.inc' ;table -|-(load_table/save_table)- csv.obj -|- table.obj ; |-(...)-----------------------------| ; | | ; |-(get_function_list)-formula.obj---| ; | ; | ; |- grid.obj ; АДРЕСАЦИЯ ОБЪЕКТА ; 2 byte 6+ byte ; \ - | - TYPE_DEFAULT_ADDR - | - page_index(0) - | - (index_h shl 24) + index_w - table_object or ext version ; | | | - (index_h shl 24) + index_w - table_object or ext version ; | | | - (index_h shl 24) + index_w - table_object or ext version ; | | | - (index_h shl 24) + index_w - table_object or ext version ; | | ; | | - page_index(1) - | - (index_h shl 24) + index_w - table_object or ext version ; | | - (index_h shl 24) + index_w - table_object or ext version ; | | - (index_h shl 24) + index_w - table_object or ext version ; | | - (index_h shl 24) + index_w - table_object or ext version ; | ; | - TYPE_EXT_ADDR - | - page_index(0) - | - (index_h shl 24) + index_w, length, name - table_object or ext version ; | | - (index_h shl 24) + index_w, length, name - table_object or ext version ; | | - (index_h shl 24) + index_w, length, name - table_object or ext version ; | | - (index_h shl 24) + index_w, length, name - table_object or ext version ; | ; | - TYPE_DEFAULT_VALUE - | - page_index(0) ; ; 4 bits 2 bits 10 bit ; type = (dir_index shl 12) + (Type_value shl 10) + page_index TYPE_DEFAULT_ADDR = 0 ; поиск по индексам TYPE_EXT_ADDR = 1b ; поиск по строке или чему-то ещё, но не по индексам TYPE_DEFAULT_VALUE = 10b ; получение дефолтного значения, индекс игнорируеся TYPE_INFO_PAGE = 11b ; получение информации о странице ; MAX_PAGE_INDEX = not -(1 shl 10) ; 1023 ; по сути индекс это для глобальных элементов, типа набора данных ; набора форматирования или набора макросов ; не более 16 включаяя зарезервированные ;DIR_INDEX_XlAM = 0 ; system data ;DIR_INDEX_TDATA = 1 ;DIR_INDEX_TFORMAT = 2 ;DIR_INDEX_RESULT = 3 ; Используется для хранения резудьтатов формул ;DIR_INDEX_MACRO = 4 ;struct table_value_addr ; size = 8 octet ; type rb 2 ; index_w rb 3 ; index_h rb 3 ; ;ends ;struct table_value_addr_ex ; size = ? ; type rb 2 ; zero rb 6 ; length rw 1 ; ; srt rb 0 ;ends ; СТРУКТУРА ОБЪЕКТА TYPE_OBJECT_LOCK = 0x80 TYPE_OBJECT_ERR = 0x40 ; ошибка вычисления формулы - вычисление невозможно, приводит к лавинообразному отказу работы формул TYPE_OBJECT_NULL = 0 TYPE_OBJECT_STR = 1 ; utf-8 TYPE_OBJECT_NUMBER = 2 ; double TYPE_OBJECT_BINARY = 3 ;TYPE_OBJECT_ struct table_object type db ? size dw ? ext_size db ? ; real_size = (ext_size shl 16) + size ends struct table_object_str type db ? ; TYPE_OBJECT_STR size dw ? __zero db ? ; real_size = (ext_size shl 16) + size str_length dw ? ; in bytes max = 2^16 - 4 - 2 str rb 0 ; utf-8 ends struct table_object_number type db ? ; TYPE_OBJECT_NUMBER size dw ? ; = 4 + 8 __zero db ? ; real_size = (ext_size shl 16) + size number dq ? ; 64 bits double ends if 0 ; ФУНКЦИИ БИБЛИОТЕКИ ;int create_table_dom(table_DOM** ptr); ;int destruct_table_dom(table_DOM* ptr); ;int get_count_dirs(table_DOM* ptr, uint32_t* count); ;int get_count_pages(table_DOM* ptr, uint32_t* count, table_value_addr* path); index_pages and index_H/W ignored int get_count_cells(table_DOM* ptr, uint64_t* count, table_value_addr* path); index_H/W ignored int enum_dirs(table_DOM* ptr, uint32_t* enumerator); int enum_pages(table_DOM* ptr, table_value_addr* path, uint32_t* enumerator); index_pages and index_H/W ignored int enum_cells(table_DOM* ptr, table_value_addr* path, uint32_t* enumerator); index_H/W ignored int get_next_enum_dir(uint32_t enumerator, uint32_t* dir_index); int get_next_enum_page(uint32_t enumerator, uint32_t* page_index); int get_next_enum_cell(uint32_t enumerator, uint32_t* cell_index); int get_next_enum_cell_ex(uint32_t enumerator, uint32_t* cell_index, table_object** tab_object); void free_enumerator(uint32_t enumerator); ; Table Object function table_object* create_table_object(uint32_t size); ;table_object* create_string_table_object(uint32_t str_length); str_length без нулл терминатора ;table_object* create_number_table_object(table_object** tab_object); table_object_number.number = (double)0.0; int destruct_table_object(table_object* ptr); int get_value(table_value_addr* path, table_object** tab_object); int set_value(table_value_addr* path,table_object* ptr); end if ; Это библотека для создания и работы с единой моделью табличного документа ; Предполагается, что документ может иметь несколько страниц, где может ; применяться различное форматирование табличных данных. Сами данные могут ; быть разнообразных типов и могут быть не привязанными к определённой ; табличной части. ; Экспортируемые функции ; 1. Общая работа с моделью табличного документа ; table_DOM* create_table_dom(); ; void destruct_table_dom(table_DOM* ptr); ; 2. ; 3. if 0 ; Рассуждения: НЕ УДАЛЯТЬ!!! ВООБЩЕ НЕ УДАЛЯТЬ!!! Предположим что структура такой модели должна быть удобной для поиска end if ; CODE struct table_value_addr ; size = 8 octet type rb 2 index_w rb 3 index_h rb 3 ends struct table_value_addr_ex ; size = this.length + 8 type rb 2 zero rb 6 length rw 1 ; srt rb 0 ends ; type = (dir_index shl 12) + (Type_value shl 10) + page_index TYPE_DEFAULT_ADDR = 0 ; поиск по индексам TYPE_EXT_ADDR = 1b ; поиск по строке или чему-то ещё, но не по индексам TYPE_DEFAULT_VALUE = 10b ; получение дефолтного значения, индекс игнорируеся TYPE_INFO_PAGE = 11b ; получение информации о странице ; MAX_PAGE_INDEX = not -(1 shl 10) ; 1023 struct PAGE_CONTEXT default_value dd ? ; ptr _size_struct dd ? ; ВРЕМЕННО!!! пока данные полностью в памяти count_tobject rd 6 ; max_index_h * max_index_w rd 2 max_h rd 1 ; 31-24 bits not set max_w rd 1 items_array rd 0 ; array of table_object ends DIR_INDEX_XlAM = 0 ; system data DIR_INDEX_TDATA = 1 DIR_INDEX_TFORMAT = 2 DIR_INDEX_RESULT = 3 ; Используется для хранения резудьтатов формул DIR_INDEX_MACRO = 4 MAX_DIR_COUNT = 16 struct DIR_INFO page_count dd ? dir_ptr dd ? ends struct table_DOM ; 8*16 + 4 dir_data rd sizeof.DIR_INFO * 16 lock_main rd 1 ; counter ends format MS COFF public @EXPORT as "EXPORTS" section 'Doczom' code readable align 16 ; IN: dword[esp + 4] - ptr buffer for ptr table_dom ; OUT: eax - error code(0 - good, other - error) create: push edi ebx mov eax, 68 mov ebx, 12 ; alloc mov ecx, sizeof.table_DOM int 0x40 test eax, eax jz .err mov ecx, [esp + 4*2 + 4] mov edi, eax mov [ecx], eax mov ecx, 1024 xor eax, eax rep stosd xor eax, eax pop ebx edi ret 4 .err: mov eax, -1 pop ebx edi ret 4 ; IN: dword[esp + 4] - ptr table_dom destruct: push esi edi ; call del from all dirs mov ecx, 16 mov esi, [esp + 4*2 + 4] lea edi, [esi + table_DOM.lock_main] sub esp, sizeof.table_value_addr .loop: cmp [esi + DIR_INFO.dir_ptr], 0 jz @f push esp push dword[esp + sizeof.table_value_addr + 4*2 + 4] call del_dir @@: add esi, sizeof.DIR_INFO cmp esi, edi jne .loop ; free table_DOM push ebx mov eax, 68 mov ebx, 13 mov ecx, [esp + 4 + 4] int 0x40 pop ebx pop edi esi ret 4 ;----------------------------------------------------------------------------- ; IN: dword[esp + 4] - ptr table_dom ; dword[esp + 8] - ptr to table_value_addr ; OUT: eax = 0 - good ; -1 - error add_dir: ; alloc 1 page for pages array ; 4096 bytes ; set pointer in table_DOM ret 8 ; IN: dword[esp + 4] - ptr table_dom ; dword[esp + 8] - ptr to table_value_addr ; OUT: eax = 0 - good ; -1 - error del_dir: ; call del_page from all pages ; unset pointer in table_DOM ; free array pages ; 4096 bytes ret 8 ; IN: dword[esp + 4] - ptr table_dom ; dword[esp + 8] - ptr to uint32_t buffer ; OUT: --- get_count_dirs: mov edx, [esp + 4] xor eax, eax mov ecx, MAX_DIR_COUNT .loop: cmp dword[edx + DIR_INFO.dir_ptr], 0 jz @f inc eax @@: add edx, sizeof.DIR_INFO loop .loop mov edx, [esp + 8] mov [edx], eax ret 8 ; IN: dword[esp + 4] - ptr table_dom ; dword[esp + 8] - ptr to uint32_t buffer ; dword[esp + 12] - ptr to table_value_addr ; OUT: --- get_count_pages: mov edx, [esp + 12] mov ecx, [esp + 4] movzx eax, word[ecx + table_value_addr.type] shr eax, 12 lea edx, [edx + eax + table_DOM.dir_data] mov eax, [edx + DIR_INFO.page_count] mov edx, [esp + 8] mov [edx], eax ret 12 ;----------------------------------------------------------------------------- ; IN: dword[esp + 4] - ptr to table_value_addr ; OUT: add_page: ; IN: dword[esp + 4] - ptr to table_value_addr ; OUT: del_page: ;----------------------------------------------------------------------------- ; IN: dword[esp + 4] - ptr table_dom ; dword[esp + 8] - ptr to uint32_t buffer ; dword[esp + 12] - ptr to table_value_addr ; OUT: --- get_count_cells: ret 12 ;----------------------------------------------------------------------------- ; Table Object function ; IN: dword[esp + 4] = size table_object ; OUT: eax - ptr to buffer for ptr to table_object create_table_object: ; alloc memory push ebx mov edx, [esp + 4 + 4] shl edx, 8 mov eax, 68 mov ecx, edx mov ebx, 12 int 0x40 pop ebx test eax, eax jz .err ; set table object size mov [eax], edx ;mov dword[eax + table_object.size], ecx ; WARNING!!! mov byte[eax + table_object.type], TYPE_OBJECT_NULL ret 4 .err: xor eax, eax ret 4 ; IN: dword[esp + 4] - ptr to table_object ; OUT: --- destruct_table_object: push ebx mov eax, 68 mov ecx, [esp + 4 + 4] mov ebx, 13 int 0x40 pop ebx ret 4 section '.data' data readable writable align 16 @EXPORT: export \ create, 'create_table_dom',\ ; test ? destruct, 'destruct_table_dom',\ ; test ? \ get_count_dirs, 'get_count_dirs',\ ; test ? get_count_pages, 'get_count_pages',\ ; test ? \ create_table_object, 'create_table_object',\ destruct_table_object, 'destruct_table_object'