|
|
1.1 root 1: #include <pads.pri>
2: SRCFILE("menu.c")
3:
4: Index ZIndex; /* = {0,0}; */
5: int Index::null() { return !(major|minor); }
6:
7: Menu::Menu() { list = 0; size = 0; }
8:
9: Menu::Menu(char *t, Action a, long o)
10: {
11: trace( "%d.Menu(%s,%d,%d)", this, t, a, o );
12: list = 0;
13: size = 0;
14: first(t, a, o);
15: }
16:
17: Menu::~Menu()
18: {
19: IList *l, *lnext;
20:
21: for( l = list; l; l = lnext ){
22: lnext = l->next; // new malloc()
23: delete l;
24: }
25: }
26:
27: void Menu::first(char *t, Action a, long o)
28: {
29: trace( "%d.first(%s,%d,%d)", this, t, a, o );
30: first( ICache->place( Item(t,a,o) ) );
31: }
32:
33: void Menu::last(char *t, Action a, long o)
34: {
35: trace( "%d.last(%s,%d,%d)", this, t, a, o );
36: last( ICache->place( Item(t,a,o) ) );
37: }
38:
39: void Menu::first(Index i)
40: {
41: trace( "%d.first(%u:%u)", this, i.major, i.minor );
42: if( i.null() ) return;
43: list = new IList(i,list);
44: ++size;
45: }
46:
47: void Menu::last(Index i)
48: {
49: IList *l;
50:
51: trace( "%d.last(%u:%u)", this, i.major, i.minor );
52: if( i.null() ) return;
53: ++size;
54: if( !list ){
55: list = new IList(i,0);
56: return;
57: }
58: for( l = list; l->next; l = l->next ) {}
59: l->next = new IList(i,0);
60: }
61:
62: int IndexTextCmp( Index a, Index b )
63: {
64: trace( "IndexTextCmp(%u:%u,%u:%u)", a.major, a.minor, b.major, b.minor );
65: return strcmp( ICache->take(a)->text, ICache->take(b)->text );
66: }
67:
68: void Menu::sort(char *t, Action a, long o )
69: {
70: int cmp;
71: IList **p;
72:
73: trace( "%d.sort(%s,%d,%d)", this, t, a, o );
74: Index i = ICache->place( Item(t,a,o) );
75: if( !list ){
76: first(i);
77: return;
78: }
79: for( p = &list; *p; p = &((*p)->next) ){
80: trace( "%u:%u", (*p)->index.major, (*p)->index.minor );
81: cmp = IndexTextCmp( i, (*p)->index );
82: if( cmp == 0 ) return;
83: if( cmp < 0 ) break;
84: }
85: ++size;
86: *p = new IList(i,*p);
87: }
88:
89: Index Menu::index(char *t, Action a, long o)
90: {
91: IList *l;
92: int i;
93: Carte *c;
94:
95: trace( "%d.index() %d", this, size );
96: if( size==0 ) return 0;
97: c = (Carte *) new char [CARTESIZE(size)];
98: c->attrib = 0;
99: if (size > 255)
100: size = 255;
101: c->size = size;
102: for( l = list, i = 1; l; l = l->next, ++i )
103: c->bin[i] = l->index;
104: if( t )
105: c->bin[0] = ICache->place(Item(t,a,o));
106: Index ix = CCache->place(c);
107: delete c;
108: return ix;
109: }
110:
111: void Menu::dump()
112: {
113: IList *l;
114:
115: trace( "%d.dump()", this );
116: for( l = list; l; l = l->next ){
117: trace( "%u:%u", l->index.major, l->index.minor );
118: }
119: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.