Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | Download | RSS feed

  1. ;-----------------------------------------------------------------------------
  2. ; Copyright (c) 2007, SPraid
  3. ;-----------------------------------------------------------------------------
  4. format MS COFF
  5.  
  6. public EXPORTS
  7.  
  8. include '../proc32.inc'
  9. include 'proc.inc'
  10.  
  11. purge section
  12. section '.flat' code readable align 16
  13.  
  14. mem.alloc   dd ?
  15. mem.free    dd ?
  16. mem.realloc dd ?
  17. dll.load    dd ?
  18.  
  19. block_count: dd 0
  20. sect_num: dd 0
  21. data_adr: dd 0
  22. data_adr_last dd 0
  23.  
  24. filei_len       EQU 0x4000
  25. filei              dd ?;0x4000   ; ссылки на данные - типа там храниться будит... вначале там - скока нада выделить
  26. sec_i_len       EQU 0x4000
  27. sec_i              dd ?;0x4000
  28. dat_i_len       EQU 0x4000
  29. dat_i              dd ?;0x4000
  30.  
  31.  
  32. ;-----------------------------------------------------------------------------
  33. proc lib_init ;////////// Инцилизация библиотеки (автоматический вызов)///////
  34. ;-----------------------------------------------------------------------------
  35.         mov     [mem.alloc],eax
  36.         mov     [mem.free],ebx
  37.         mov     [mem.realloc],ecx
  38.         mov     [dll.load],edx
  39.         xor eax,eax
  40.         inc eax
  41.         ret
  42. endp
  43.  
  44.  
  45. ; структура блока
  46.         block_adr EQU 0
  47.         block_name EQU block_adr + 4
  48.         block_i_count EQU block_name + 30
  49.         block_len EQU block_i_count + 4
  50. ; структура данных
  51.         data_name EQU 0
  52.         data_prev EQU data_name+200
  53.         data_next EQU data_prev+4
  54.         data_len EQU data_next+4
  55.  
  56.  
  57.  
  58.  
  59. ; взять следущий пару занчения ключа
  60. proc ini.get_par stdcall, sect:dword, param:dword, val:dword, num:dword
  61.  
  62.   pushad
  63.   mov edx,[block_count]
  64.   mov edi,[sect]
  65.   mov esi,[sec_i]
  66.   add esi,block_name
  67. @@: call strcmp
  68.   cmp eax,-1
  69.   jne .sec_found
  70.   dec edx
  71.   or edx,edx
  72.   jz .sec_not_found
  73.   add esi,block_len
  74.   jmp @b
  75.  .sec_found:
  76.  
  77.   mov eax,esi
  78.   sub eax,block_name
  79.   add eax, block_i_count
  80.   mov eax,[eax]
  81.   ; eax - count
  82.   mov ebx,[num]                  ; test max count
  83.   ; ebx - num
  84.   cmp eax,ebx
  85.   jle .param_not_found
  86.  
  87.   sub esi,4
  88.   mov esi,[esi]
  89.   ; esi - first adr
  90.   mov eax,ebx    ; eax - num
  91. @@:
  92.   or eax,eax
  93.   je .param_found
  94.   dec eax
  95.   add esi,data_next
  96.   mov esi,[esi]
  97.   jmp @b
  98.  
  99.  .param_found:
  100.   mov ebx,esi
  101.   mov eax,[param]
  102.   mov cl,'='
  103.   call copy_s
  104.   add ebx,eax
  105.   add ebx,1
  106.   mov eax,[val]
  107.   mov cl,0
  108.   call copy_s
  109.   jmp .ok
  110.  
  111.  .param_not_found:
  112.  .sec_not_found:
  113. ; set_default_.... 0
  114.  mov eax,[param]
  115.  mov [eax],byte 0
  116.  mov eax,[val]
  117.  mov [eax],byte 0
  118.  .ok:
  119.   popad
  120.   ret
  121.  
  122.  
  123. endp
  124. ;------------------------------------------------------
  125. proc ini.get_str stdcall, sect:dword, param:dword, buff:dword, default:dword
  126.   ; sect - секция
  127.   ; param - параметр
  128.   ; buff - буфер
  129.   ; default - если отсутствует
  130.  pushad
  131.   mov edx,[block_count]
  132.   mov edi,[sect]
  133.   mov esi,[sec_i]
  134.   add esi,block_name
  135. @@: call strcmp
  136.   cmp eax,-1
  137.   jne .sec_found
  138.   dec edx
  139.   or edx,edx
  140.   jz .sec_not_found
  141.   add esi,block_len
  142.   jmp @b
  143.  .sec_found:
  144.  
  145.   mov eax,esi
  146.   sub eax,block_name
  147.   add eax, block_i_count
  148.   mov eax,[eax]
  149.   ; eax - count
  150.   sub esi,4
  151.   mov esi,[esi]
  152.   ; esi - first adr
  153.   mov edi,[param]
  154.   push eax
  155.  
  156. @@:
  157.   mov cl,'='
  158.   mov eax,text
  159.   mov ebx,esi
  160.   call copy_s
  161.   mov edx,eax
  162.   push esi
  163.   mov esi,text
  164.   call strcmp
  165.   pop esi
  166.   cmp eax,-1
  167.   jne .param_found
  168.   pop eax
  169.   dec eax
  170.   or eax,eax
  171.   jz .sec_not_found
  172.   push eax
  173.   add esi,data_next
  174.   mov esi,[esi]
  175.   jmp @b
  176.  .param_found:
  177.   mov ebx,esi
  178.   add ebx,edx
  179.   add ebx,1
  180.   pop eax
  181.   mov eax,[buff]
  182.   mov cl,0
  183.   call copy_s
  184.   jmp .ok
  185.  .param_not_found:
  186.  .sec_not_found:
  187. ; set_default_text
  188.   mov eax,[buff]
  189.   mov ebx,[default]
  190.   mov cl,0
  191.   call copy_s
  192.  .ok:
  193.   popad
  194.   ret
  195. endp
  196. ;--------------------------------------------------------------------------------
  197.  
  198.  
  199.  
  200.  
  201.  
  202.  
  203.  
  204.  
  205.  
  206.  
  207.  
  208.  
  209.  
  210.  
  211. ;-----------------------------------------------------------------------------
  212. proc ini.load stdcall filename ;/(загрузка ини файла)/////////////////////////
  213. locals
  214.  reads: dd 0,0,0
  215.  fsize  dd 0
  216.  addr   dd filei
  217.  nulls  db 0
  218.  fname  dd 0
  219. endl
  220.         mov [reads],dword 0
  221.         mov [reads+4],dword 0
  222.         mov [reads+8],dword 0
  223.         mov [nulls],byte 0
  224.  
  225.         stdcall get_filesize, [filename]
  226.         mov [fsize],eax
  227.  
  228.         inc eax
  229.  
  230.         mov ebx,eax
  231.  
  232.         invoke  mem.alloc,eax
  233.         mov [filei],eax
  234.  
  235.         mov [addr],eax
  236.  
  237.         add eax,ebx
  238.         mov [eax], byte 0               ;null string
  239.  
  240.         invoke  mem.alloc,sec_i_len
  241.         mov [sec_i],eax
  242.  
  243.         invoke  mem.alloc,dat_i_len
  244.         mov [dat_i],eax
  245.         mov [data_adr],eax
  246.  
  247.         mov eax,[filename]
  248.         mov [fname],eax
  249.  
  250.         mov eax,70
  251.         mov ebx , reads-ebp
  252.         add ebx,ebp
  253.         int 0x40
  254.  
  255.         stdcall readlnf
  256.  
  257.     xor eax,eax
  258.         ret
  259.  
  260.  
  261. endp
  262.  
  263.  
  264. proc readlnf
  265.  pushad
  266.  mov [.pos],dword 0
  267. .char:
  268.  mov eax,[.pos]
  269.  inc eax
  270.  mov [.pos],eax
  271.  
  272.  sub eax,1
  273.  add eax,[filei]
  274.  mov al,[eax]                           ; символ от позиции
  275.                                                         ; тип по первому символу
  276.  cmp al,' '
  277.  je .char
  278.  cmp al,9
  279.  je .char
  280.  cmp al,13
  281.  je .char
  282.  cmp al,10
  283.  je .char
  284.  cmp al,'['
  285.  je .sect
  286.  cmp al,0
  287.  je .exit
  288. ;------------------------------------------------------------------------------------------
  289.         ; чтение параметров
  290.  mov eax,[data_adr]
  291.  mov ebx,[.pos]
  292.  add ebx,[filei]
  293.  dec ebx
  294.  mov cl,0xD
  295.  call copy_s
  296.  xchg ebx,eax
  297.  mov eax,[.pos]
  298.  add eax,ebx
  299.  mov [.pos],eax
  300.  
  301.  
  302.  mov ebx,[data_adr]
  303.  mov ecx,[data_adr_last]
  304.  mov [ebx+data_prev],ecx
  305.  ;add ebx,data_next
  306.  mov [ecx],ebx
  307.  add ebx,data_next
  308.  mov [data_adr_last],ebx
  309.  
  310.  add ebx,data_len-data_next
  311.  mov [data_adr],ebx
  312.  mov eax,[sect_num]
  313.  imul eax,eax,block_len
  314.  add eax,[sec_i]
  315.  add eax, block_i_count
  316.  mov ebx,[eax]
  317.  inc ebx
  318.  mov [eax],ebx
  319.  jmp .test_next
  320. ;-----------------------------------------------------------------------------------------------------------------
  321. .sect:                                          ; чтение секции
  322.  mov eax,[block_count]
  323.  imul eax,eax,block_len
  324.                                                         ; копируем имя (до ])
  325.  add eax,[sec_i]
  326.  add eax,block_name                     ; кужа ложить имя
  327.  mov ebx,[.pos]
  328.  add ebx,[filei]                                ; откуда
  329.  mov cl,']'
  330.  call copy_s                            ; ложим
  331.  
  332.  
  333.  mov ebx,[.pos]
  334.  add ebx,eax
  335.  ;sub ebx,filei
  336.  add ebx,1
  337.  mov [.pos],ebx
  338.  
  339.  mov eax,[block_count]          ; прибавить количество блоков
  340.  mov [sect_num],eax
  341.  mov ebx,eax
  342.  imul eax,eax,block_len         ; это будит адрес пердыдущего для первого элемента
  343.  add eax,[sec_i]
  344.  mov [data_adr_last],eax
  345.  inc ebx
  346.  mov [block_count],ebx
  347.  
  348.  
  349. .test_next:
  350.  cmp [.pos] ,dword 97
  351.  jb .char
  352.  
  353. .exit:
  354.  
  355.  popad
  356.  ret
  357.  
  358.  .pos dd 0
  359.  
  360. endp
  361.  
  362.  
  363.    text db 255 dup(?)
  364.  
  365. align 16
  366. EXPORTS:
  367.  
  368. export  \
  369.         lib_init   ,'lib_init',\
  370.         ini.load   ,'ini.load',\
  371.         ini.get_str,'ini.get_str',\
  372.         ini.get_par,'ini.get_par'