Subversion Repositories Kolibri OS

Rev

Rev 4997 | Rev 5037 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  2. ;;                                                              ;;
  3. ;; Copyright (C) KolibriOS team 2004-2014. All rights reserved. ;;
  4. ;; Distributed under terms of the GNU General Public License    ;;
  5. ;;                                                              ;;
  6. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  7.  
  8. head dd 0
  9. size dd 0
  10.  
  11. linkedlist_add:
  12.     push ebx
  13.         mov     ebx, [head]                            
  14.         mov     [head], eax
  15.         mov     [eax + node.next], ebx 
  16.     pop ebx
  17.         ret
  18.  
  19. linkedlist_delete:
  20.     push ebx ecx
  21.         mov ebx, eax     ; eax - pointer to node for delete
  22.         cmp eax, [head]
  23.         jz  .unlink_head
  24.  
  25.   .getnext:
  26.         cmp [ebx+node.next], eax
  27.         jz  .unlink
  28.         cmp [ebx+node.next], 0
  29.         jz  .invalid_pointer
  30.         mov ebx, [ebx+node.next]
  31.         jmp .getnext
  32.  
  33.   .unlink:
  34.         mov ecx, [eax+node.next]
  35.         mov [ebx+node.next], ecx
  36.         jmp @f
  37.    
  38.   .unlink_head:
  39.         mov ebx, [eax+node.next]
  40.         mov [head], ebx
  41.   @@:
  42.         mov   ecx, eax
  43.         call  Kfree
  44.   .invalid_pointer:
  45.   pop   ecx ebx
  46.         ret
  47.    
  48. linkedlist_isvalid:       ;eax - pointer to check; returns zero if valid
  49.     inc   ecx
  50.     test  eax, eax
  51.     jz    .valid_pointer  ;actually, poiner is not valid
  52.     push  ebx ecx
  53.     xor   ecx, ecx
  54.     mov   ebx, [head]
  55.   .next_check:
  56.     cmp   eax, ebx
  57.     jz    .valid_pointer
  58.     mov   ebx, [ebx + node.next]
  59.     test  ebx, ebx
  60.     jz    .invalid_pointer
  61.     jmp   .next_check      
  62.   .invalid_pointer:  
  63.     inc   ecx
  64.   .valid_pointer:
  65.     mov   eax, ecx
  66.     pop   ecx ebx
  67.     ret
  68.  
  69. linkedlist_gethead:
  70.         mov     eax, [head]
  71.         ret
  72.  
  73. restore node
  74. restore node.next