Skip to content

Commit 865f19e

Browse files
committed
c
1 parent 2361c61 commit 865f19e

File tree

4 files changed

+63
-2
lines changed

4 files changed

+63
-2
lines changed

PLATFORM/C/LIB/collections.lsts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,18 +66,20 @@ let .find-first(list: t, elem: e): Maybe<U64> = (
6666
let found = false;
6767

6868
let i = 0_u64;
69+
let where = 0_u64;
6970
let len = list.length();
7071
while i < len {
7172
if list[i] == elem {
7273
found = true;
74+
where = i;
7375
i = len; # break
7476
} else {
7577
i = i + 1;
7678
};
7779
};
7880

7981
if found {
80-
Some{i}
82+
Some{where}
8183
} else {
8284
None{} :: Maybe<U64>
8385
}

PLATFORM/C/LIB/hashtable.lsts

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,61 @@
22
type HashtableEq<k,v> = HashtableEq { occupied: U64, capacity: U64, contents: Tuple<k,v>[] }
33
| HashtableEqEOF;
44

5+
let .clone(self: HashtableEq<k,v>): HashtableEq<k,v> = (
6+
match self {
7+
HashtableEq { occupied=occupied } => (
8+
let contents = (self as Tag::HashtableEq).contents;
9+
let new-sz = sizeof(Tuple<k,v>) * occupied;
10+
let cpy = malloc(new-sz) as Tuple<k,v>[];
11+
12+
let i = 0;
13+
while i < occupied {
14+
cpy[i] = contents[i];
15+
i = i + 1;
16+
};
17+
18+
HashtableEq { occupied, occupied, cpy }
19+
);
20+
21+
HashtableEqEOF {} => (HashtableEqEOF :: HashtableEq<k,v>);
22+
}
23+
);
24+
25+
type HashtableEqIter<k,v> = HashtableEqIter { table: HashtableEq<k,v>, idx: U64 };
26+
27+
# for safety, we clone the table
28+
# All modifications done to the vector after creating the iterator will not be seen
29+
let .iter(self: HashtableEq<k,v>): HashtableEqIter<k,v> = (
30+
let clone = self.clone();
31+
clone.unsafe-iter()
32+
);
33+
34+
# If you modify the table after creating the iterator, weird things will happen
35+
let .unsafe-iter(self: HashtableEq<k,v>): HashtableEqIter<k,v> = (
36+
HashtableEqIter { self, 0_u64 }
37+
);
38+
39+
let .next(p: Array<HashtableEqIter<k,v>,?>): Maybe<Tuple<k,v>> = (
40+
let v = open(p);
41+
match v.table {
42+
HashtableEq { occupied=occupied } => (
43+
if v.idx < occupied {
44+
let contents = (v.table as Tag::HashtableEq).contents;
45+
let val = contents[v.idx];
46+
v.idx = v.idx + 1;
47+
p[0] = v;
48+
Some { val } :: Maybe<Tuple<k,v>>
49+
} else {
50+
None :: Maybe<Tuple<k,v>>
51+
}
52+
);
53+
54+
HashtableEqEOF {} => (
55+
None :: Maybe<Tuple<k,v>>
56+
);
57+
};
58+
);
59+
560
let .lookup(table: HashtableEq<k,v>, key: k, default: v): v = (
661
let capacity = (table as Tag::HashtableEq).capacity;
762
if capacity > 0_u64 {

PLATFORM/C/LIB/io.lsts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11

22
let .file-extension(path: CString): CString = (
3-
let dot = path.find-last(46_u8);
3+
let dot = path.find-last(c"."[0]);
44
match dot {
55
Some{content=content} => path.substring(content + 1);
66
None{} => untern("");

SRC/plugins-frontends.lsts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,10 @@ let plugins-frontends-index = {} :: HashtableEq<CString,Arrow<CString,Nil>>;
33

44
let plugin-null-frontend(fp: CString): Nil = (
55
print("Unable to find a suitable frontend: \{fp}\n");
6+
print("Registered frontends:\n");
7+
for frontend in plugins-frontends-index.iter() {
8+
print("- \{frontend.first}");
9+
};
610
exit(1);
711
);
812

0 commit comments

Comments
 (0)