File: chain.c

package info (click to toggle)
mmorph 2.3.4.2-9
  • links: PTS
  • area: main
  • in suites: etch, etch-m68k
  • size: 920 kB
  • ctags: 904
  • sloc: ansic: 4,992; yacc: 1,215; lex: 417; makefile: 295; sh: 48; sed: 33; csh: 26
file content (102 lines) | stat: -rw-r--r-- 2,165 bytes parent folder | download | duplicates (8)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
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
/*
    mmorph, MULTEXT morphology tool
    Version 2.3, October 1995
    Copyright (c) 1994,1995 ISSCO/SUISSETRA, Geneva, Switzerland
    Dominique Petitpierre, <petitp@divsun.unige.ch>
*/
/*
    bitmap.c

    handle circular list (chains)
    used to preserve order of insertion.

    Dominique Petitpierre, ISSCO Summer 1994

*/

#include "config.h"
#include "chain.h"
#include "mymalloc.h"

s_chain    *
insert_chain_link(chain, item)
s_chain    *chain;
char       *item;

{
    s_chain    *new_chain_link;

    MY_MALLOC(new_chain_link, s_chain);
    new_chain_link->item = item;
    if (chain) {
	new_chain_link->next = chain->next;	/* keep track of first link */
	chain->next = new_chain_link;	/* append link */
    }
    else {
	new_chain_link->next = new_chain_link;	/* first link is last link */
    }
    return (new_chain_link);	/* last link */
}

s_chain    *
reverse_chain(chain)
s_chain    *chain;

{
    s_chain    *previous_chain_link;
    s_chain    *next_current;
    s_chain    *current_chain_link;
    s_chain    *start_chain;

    if (chain) {
	previous_chain_link = chain;
	start_chain = chain->next;
	current_chain_link = start_chain;
	do {
	    next_current = current_chain_link->next;
	    current_chain_link->next = previous_chain_link;
	    previous_chain_link = current_chain_link;
	    current_chain_link = next_current;
	} while (current_chain_link != start_chain);
	return (current_chain_link);	/* new last link */
    }
    else
	return (chain);
}

void
map_chain(chain, action)
s_chain    *chain;
void        (*action) ();

{
    s_chain    *start_chain;
    s_chain    *current_chain_link;

    if (chain) {
	start_chain = chain->next;
	current_chain_link = start_chain;
	do {
	    action(current_chain_link->item);
	    current_chain_link = current_chain_link->next;
	} while (current_chain_link != start_chain);
    }
}

void
free_chain(chain)
s_chain    *chain;

{
    s_chain    *current_chain_link;
    s_chain    *next;

    if (chain) {
	current_chain_link = chain;
	do {
	    next = current_chain_link->next;
	    MY_FREE(current_chain_link);
	    current_chain_link = next;
	} while (current_chain_link != chain);
    }
}