Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
att
GitHub Repository: att/ast
Path: blob/master/src/lib/librecsort/rsdisc.c
1808 views
1
/***********************************************************************
2
* *
3
* This software is part of the ast package *
4
* Copyright (c) 1996-2011 AT&T Intellectual Property *
5
* and is licensed under the *
6
* Eclipse Public License, Version 1.0 *
7
* by AT&T Intellectual Property *
8
* *
9
* A copy of the License is available at *
10
* http://www.eclipse.org/org/documents/epl-v10.html *
11
* (with md5 checksum b35adb5213ca9657e911e9befb180842) *
12
* *
13
* Information and Software Systems Research *
14
* AT&T Research *
15
* Florham Park NJ *
16
* *
17
* Phong Vo <[email protected]> *
18
* Glenn Fowler <[email protected]> *
19
* *
20
***********************************************************************/
21
#include "rshdr.h"
22
23
/* Change discipline for a context
24
**
25
** Written by Kiem-Phong Vo (07/29/96).
26
*/
27
28
#if __STD_C
29
Rsdisc_t* rsdisc(Rs_t* rs, Rsdisc_t* disc, int op)
30
#else
31
Rsdisc_t* rsdisc(rs, disc, op)
32
Rs_t* rs;
33
Rsdisc_t* disc;
34
int op;
35
#endif
36
{
37
reg Rsdisc_t* old;
38
reg Rsdisc_t* cur;
39
reg Rsdisc_t* prv;
40
reg Rsdisc_t* top;
41
42
switch (op)
43
{
44
case RS_DISC:
45
old = rs->disc;
46
if(disc)
47
{ if(old && (old->events & RS_DISC) &&
48
(*old->eventf)(rs,RS_DISC,(Void_t*)disc,(Void_t*)0,old) < 0)
49
return NIL(Rsdisc_t*);
50
51
rs->type &= ~(RS_DSAMELEN|RS_KSAMELEN);
52
rs->type |= disc->type&(RS_DSAMELEN|RS_KSAMELEN);
53
54
if((disc->type&RS_DSAMELEN) && !disc->defkeyf)
55
rs->type |= RS_KSAMELEN;
56
57
rs->disc = disc;
58
rs->events = rs->disc->events;
59
for (cur = rs->disc; cur; cur = cur->disc)
60
rs->events |= cur->events;
61
}
62
return old;
63
case RS_NEXT:
64
cur = rs->disc;
65
if (disc)
66
while (top = cur)
67
{
68
cur = cur->disc;
69
if (disc == top)
70
break;
71
}
72
return cur;
73
case RS_POP:
74
prv = 0;
75
cur = rs->disc;
76
if (disc)
77
while (cur && cur != disc)
78
cur = (prv = cur)->disc;
79
if (cur)
80
{
81
disc = cur;
82
if (prv)
83
prv->disc = cur->disc;
84
else
85
rs->disc = cur->disc;
86
if ((disc->events & RS_POP) &&
87
(*disc->eventf)(rs, RS_POP, (Void_t*)0, (Void_t*)0, disc) < 0)
88
return 0;
89
if (rs->disc)
90
{
91
rs->events = rs->disc->events;
92
for (cur = rs->disc; cur; cur = cur->disc)
93
rs->events |= cur->events;
94
}
95
}
96
else
97
disc = 0;
98
return disc;
99
case RS_PUSH:
100
if (!disc)
101
return 0;
102
for (prv = 0, cur = rs->disc; cur; cur = (prv = cur)->disc)
103
if (cur == disc)
104
{
105
if (prv)
106
{
107
/*
108
* move to front
109
*/
110
111
prv->disc = cur->disc;
112
cur->disc = rs->disc;
113
rs->disc = cur;
114
}
115
return disc;
116
}
117
disc->disc = rs->disc;
118
rs->disc = disc;
119
rs->events |= disc->events;
120
return disc;
121
}
122
return 0;
123
}
124
125