Subversion Repositories Kolibri OS

Rev

Rev 5036 | Rev 5085 | 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.  
  10. linkedlist_add:
  11.     push    ebx
  12.         mov         ebx, [head]                        
  13.         mov         [head], eax
  14.         mov         [eax + node.next], ebx     
  15.     pop     ebx
  16.         ret
  17.  
  18. linkedlist_delete:
  19.     push    ebx ecx
  20.         mov     ebx, eax         ; eax - pointer to node for delete
  21.         cmp     eax, [head]
  22.         jz      .unlink_head
  23.  
  24.   .getnext:
  25.         cmp     [ebx+node.next], eax
  26.         jz      .unlink
  27.         cmp     [ebx+node.next], 0
  28.         jz      .invalid_pointer
  29.         mov     ebx, [ebx+node.next]
  30.         jmp     .getnext
  31.  
  32.   .unlink:
  33.         mov     ecx, [eax+node.next]
  34.         mov     [ebx+node.next], ecx
  35.         jmp     @f
  36.    
  37.   .unlink_head:
  38.         mov     ebx, [eax+node.next]
  39.         mov     [head], ebx
  40.   @@:
  41.         mov     ecx, eax
  42.         call    Kfree
  43.   .invalid_pointer:
  44.     pop     ecx ebx
  45.         ret
  46.    
  47. linkedlist_isvalid:       ;eax - pointer to check; returns zero if valid
  48.     push    ebx ecx
  49.     xor     ecx, ecx
  50.     test    eax, eax
  51.     jz      .invalid_pointer
  52.     mov     ebx, [head]
  53.   .next_check:
  54.     cmp     eax, ebx
  55.     jz      .valid_pointer
  56.     mov     ebx, [ebx + node.next]
  57.     test    ebx, ebx
  58.     jz      .invalid_pointer
  59.     jmp     .next_check      
  60.   .invalid_pointer:  
  61.     inc     ecx
  62.   .valid_pointer:
  63.     mov     eax, ecx
  64.     pop     ecx ebx
  65.     ret
  66.  
  67. linkedlist_gethead:
  68.         mov     eax, [head]
  69.         ret
  70.  
  71. restore node
  72. restore node.next