summary refs log tree commit diff stats
path: root/tools/nimblepkglist.nim
Commit message (Expand)AuthorAgeFilesLines
* make implicit cstring conversions explicit (#19488)ee72022-08-191-6/+6
* walkDirRecFilter, update doc CI filter, compiler/index.nim for docs + variou...Timothee Cour2020-06-011-0/+3
* complete removal of web folder, fixes #9304 (#9310)Miran2018-10-121-0/+77
30'>30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107










































































































                                                                               
#
#
#           The Nimrod Compiler
#        (c) Copyright 2008 Andreas Rumpf
#
#    See the file "copying.txt", included in this
#    distribution, for details about the copyright.
#

# This module implements a generic doubled linked list.

type 
  PListEntry* = ref TListEntry
  TListEntry* = object of TObject
    prev*, next*: PListEntry

  TStrEntry* = object of TListEntry
    data*: string

  PStrEntry* = ref TStrEntry
  TLinkedList* = object       # for the "find" operation:
    head*, tail*: PListEntry
    Counter*: int

  TCompareProc* = proc (entry: PListEntry, closure: Pointer): bool

proc InitLinkedList*(list: var TLinkedList)
proc Append*(list: var TLinkedList, entry: PListEntry)
proc Prepend*(list: var TLinkedList, entry: PListEntry)
proc Remove*(list: var TLinkedList, entry: PListEntry)
proc InsertBefore*(list: var TLinkedList, pos, entry: PListEntry)
proc Find*(list: TLinkedList, fn: TCompareProc, closure: Pointer): PListEntry
proc AppendStr*(list: var TLinkedList, data: string)
proc IncludeStr*(list: var TLinkedList, data: string): bool
proc PrependStr*(list: var TLinkedList, data: string)
# implementation

proc InitLinkedList(list: var TLinkedList) = 
  list.Counter = 0
  list.head = nil
  list.tail = nil

proc Append(list: var TLinkedList, entry: PListEntry) = 
  Inc(list.counter)
  entry.next = nil
  entry.prev = list.tail
  if list.tail != nil: 
    assert(list.tail.next == nil)
    list.tail.next = entry
  list.tail = entry
  if list.head == nil: list.head = entry
  
proc newStrEntry(data: string): PStrEntry = 
  new(result)
  result.data = data

proc AppendStr(list: var TLinkedList, data: string) = 
  append(list, newStrEntry(data))

proc PrependStr(list: var TLinkedList, data: string) = 
  prepend(list, newStrEntry(data))

proc IncludeStr(list: var TLinkedList, data: string): bool = 
  var it: PListEntry
  it = list.head
  while it != nil: 
    if PStrEntry(it).data == data: 
      return true             # already in list
    it = it.next
  AppendStr(list, data)       # else: add to list
  result = false

proc InsertBefore(list: var TLinkedList, pos, entry: PListEntry) = 
  assert(pos != nil)
  if pos == list.head: 
    prepend(list, entry)
  else: 
    Inc(list.counter)
    entry.next = pos
    entry.prev = pos.prev
    if pos.prev != nil: pos.prev.next = entry
    pos.prev = entry

proc Prepend(list: var TLinkedList, entry: PListEntry) = 
  Inc(list.counter)
  entry.prev = nil
  entry.next = list.head
  if list.head != nil: 
    assert(list.head.prev == nil)
    list.head.prev = entry
  list.head = entry
  if list.tail == nil: list.tail = entry
  
proc Remove(list: var TLinkedList, entry: PListEntry) = 
  Dec(list.counter)
  if entry == list.tail: 
    list.tail = entry.prev
  if entry == list.head: 
    list.head = entry.next
  if entry.next != nil: entry.next.prev = entry.prev
  if entry.prev != nil: entry.prev.next = entry.next
  
proc Find(list: TLinkedList, fn: TCompareProc, closure: Pointer): PListEntry = 
  result = list.head
  while result != nil: 
    if fn(result, closure): return 
    result = result.next