summaryrefslogtreecommitdiff
path: root/src/test/java/com
diff options
context:
space:
mode:
Diffstat (limited to 'src/test/java/com')
-rw-r--r--src/test/java/com/seaofnodes/simple/Chapter04Test.java2
-rw-r--r--src/test/java/com/seaofnodes/simple/Chapter06Test.java16
-rw-r--r--src/test/java/com/seaofnodes/simple/Chapter09Test.java8
-rw-r--r--src/test/java/com/seaofnodes/simple/Chapter10Test.java8
-rw-r--r--src/test/java/com/seaofnodes/simple/Chapter11Test.java2
-rw-r--r--src/test/java/com/seaofnodes/simple/Chapter13Test.java97
-rw-r--r--src/test/java/com/seaofnodes/simple/Chapter15Test.java18
-rw-r--r--src/test/java/com/seaofnodes/simple/Chapter16Test.java16
-rw-r--r--src/test/java/com/seaofnodes/simple/Chapter17Test.java35
-rw-r--r--src/test/java/com/seaofnodes/simple/Chapter18Test.java16
-rw-r--r--src/test/java/com/seaofnodes/simple/Chapter19Test.java6
-rw-r--r--src/test/java/com/seaofnodes/simple/Chapter20Test.java8
-rw-r--r--src/test/java/com/seaofnodes/simple/Chapter21Test.java5
-rw-r--r--src/test/java/com/seaofnodes/simple/Chapter22Test.java6
-rw-r--r--src/test/java/com/seaofnodes/simple/Chapter23Test.java249
-rw-r--r--src/test/java/com/seaofnodes/simple/Eval2.java45
-rw-r--r--src/test/java/com/seaofnodes/simple/EvalArm64.java12
-rw-r--r--src/test/java/com/seaofnodes/simple/EvalRisc5.java1
-rw-r--r--src/test/java/com/seaofnodes/simple/MergeSortTest.java1
-rw-r--r--src/test/java/com/seaofnodes/simple/Simple.java8
-rw-r--r--src/test/java/com/seaofnodes/simple/TestC.java24
-rw-r--r--src/test/java/com/seaofnodes/simple/TypeTest.java88
-rw-r--r--src/test/java/com/seaofnodes/simple/evaluator/Evaluator.java7
-rw-r--r--src/test/java/com/seaofnodes/simple/evaluator/Scheduler.java3
-rw-r--r--src/test/java/com/seaofnodes/simple/fuzzer/Fuzzer.java8
-rw-r--r--src/test/java/com/seaofnodes/simple/fuzzer/FuzzerUtils.java4
-rw-r--r--src/test/java/com/seaofnodes/simple/fuzzer/Reducer.java11
-rw-r--r--src/test/java/com/seaofnodes/simple/fuzzer/ScriptGenerator.java207
-rw-r--r--src/test/java/com/seaofnodes/simple/progs/and1.smp10
-rw-r--r--src/test/java/com/seaofnodes/simple/progs/and2.smp16
-rw-r--r--src/test/java/com/seaofnodes/simple/progs/and3.smp14
-rw-r--r--src/test/java/com/seaofnodes/simple/progs/large.smp5344
-rw-r--r--src/test/java/com/seaofnodes/simple/progs/or1.smp12
-rw-r--r--src/test/java/com/seaofnodes/simple/progs/or2.smp23
-rw-r--r--src/test/java/com/seaofnodes/simple/progs/print.smp8
-rw-r--r--src/test/java/com/seaofnodes/simple/progs/ptrand.smp10
-rw-r--r--src/test/java/com/seaofnodes/simple/progs/stringHash.smp5
37 files changed, 6102 insertions, 251 deletions
diff --git a/src/test/java/com/seaofnodes/simple/Chapter04Test.java b/src/test/java/com/seaofnodes/simple/Chapter04Test.java
index c6199193..1361d8b6 100644
--- a/src/test/java/com/seaofnodes/simple/Chapter04Test.java
+++ b/src/test/java/com/seaofnodes/simple/Chapter04Test.java
@@ -63,7 +63,7 @@ public class Chapter04Test {
// Adding functions means `main` does not constant fold the incoming arg value
@Ignore @Test
public void testConstantArg() {
- CodeGen code = new CodeGen("return arg; ", TypeInteger.constant(2), 123L).parse();
+ CodeGen code = new CodeGen("return arg; ", TypeInteger.constant(2), 123L, true).parse();
assertEquals("return 2;", code.expr().in(1).toString());
}
diff --git a/src/test/java/com/seaofnodes/simple/Chapter06Test.java b/src/test/java/com/seaofnodes/simple/Chapter06Test.java
index b6bc2bf3..1ff875b4 100644
--- a/src/test/java/com/seaofnodes/simple/Chapter06Test.java
+++ b/src/test/java/com/seaofnodes/simple/Chapter06Test.java
@@ -104,7 +104,7 @@ else if( arg==3 )
else
a=5;
return a;
-""", TypeInteger.constant(2), 123L).parse().opto();
+""", TypeInteger.constant(2), 123L, true).parse().opto();
assertEquals("return 5;", code.print());
}
@@ -124,7 +124,7 @@ else if( arg==3 )
else
a=5;
return a;
-""", TypeInteger.constant(1), 123L).parse().opto();
+""", TypeInteger.constant(1), 123L, true).parse().opto();
assertEquals("return 3;", code.print());
}
@@ -164,7 +164,7 @@ else if( arg==3 )
else
a=5;
return a;
-""", TypeInteger.constant(1), 123L);
+""", TypeInteger.constant(1), 123L, true);
code.parse().opto();
assertEquals("return 3;", code.print());
}
@@ -185,7 +185,7 @@ else if( arg==3 )
else
a=5;
return a;
-""", TypeInteger.constant(3), 123L);
+""", TypeInteger.constant(3), 123L, true);
code.parse().opto();
assertEquals("return 4;", code.print());
}
@@ -220,7 +220,7 @@ if( arg ) {
else b = 3;
}
return a+b;
-""", TypeInteger.constant(1), 123L);
+""", TypeInteger.constant(1), 123L, true);
code.parse().opto();
assertEquals("return 4;", code.print());
}
@@ -238,7 +238,7 @@ if( arg ) {
else b = 3;
}
return a+b;
-""", TypeInteger.constant(0), 123L);
+""", TypeInteger.constant(0), 123L, true);
code.parse().opto();
assertEquals("return 1;", code.print());
}
@@ -277,7 +277,7 @@ if( arg ) {
else b = 3;
}
return a+b+c;
-""", TypeInteger.constant(1), 123L);
+""", TypeInteger.constant(1), 123L, true);
code.parse().opto();
assertEquals("return 6;", code.print());
}
@@ -297,7 +297,7 @@ if( arg ) {
else b = 3;
}
return a+b+c;
-""", TypeInteger.constant(2), 123L);
+""", TypeInteger.constant(2), 123L, true);
code.parse().opto();
assertEquals("return 5;", code.print());
}
diff --git a/src/test/java/com/seaofnodes/simple/Chapter09Test.java b/src/test/java/com/seaofnodes/simple/Chapter09Test.java
index d4d02aa9..54a14a25 100644
--- a/src/test/java/com/seaofnodes/simple/Chapter09Test.java
+++ b/src/test/java/com/seaofnodes/simple/Chapter09Test.java
@@ -126,9 +126,10 @@ while(v1+arg) {
v0=1;
v1=v2;
}
+return 0;
""");
code.parse().opto();
- assertEquals("return Top;", code.print());
+ assertEquals("return 0;", code.print());
}
@Test
@@ -208,7 +209,7 @@ return -0+0+0;
@Test
public void testFuzz3() {
- CodeGen code = new CodeGen("int v0=0; while(0==69) while(v0) return 0;");
+ CodeGen code = new CodeGen("int v0=0; while(0==69) while(v0) return 0; return 0;");
code.parse().opto();
assertEquals("return 0;", code.print());
}
@@ -254,9 +255,10 @@ return 0!=0;
int v0=0;
while(0==1) while(v0)
v0=1+v0;
+return 0;
""");
code.parse().opto();
- assertEquals("Stop[ ]", code.print());
+ assertEquals("return 0;", code.print());
}
@Test
diff --git a/src/test/java/com/seaofnodes/simple/Chapter10Test.java b/src/test/java/com/seaofnodes/simple/Chapter10Test.java
index 712704db..ec363239 100644
--- a/src/test/java/com/seaofnodes/simple/Chapter10Test.java
+++ b/src/test/java/com/seaofnodes/simple/Chapter10Test.java
@@ -115,7 +115,7 @@ if (arg) bar = null;
bar.a = 1;
return bar.a;
""");
- try { code.parse().opto(); fail(); }
+ try { code.parse().opto().typeCheck(); fail(); }
catch( Exception e ) { assertEquals("Type null is not of declared type *Bar",e.getMessage()); }
}
@@ -141,7 +141,7 @@ if (arg) bar = null;
bar.a = 1;
return bar.a;
""");
- try { code.parse(); fail(); }
+ try { code.parse().opto().typeCheck(); fail(); }
catch( Exception e ) { assertEquals("Type null is not of declared type *Bar", e.getMessage()); }
}
@@ -290,7 +290,7 @@ return new s0;
int v0=null.f0;
""");
try { code.parse(); fail(); }
- catch( Exception e ) { assertEquals("Accessing unknown field 'f0' from 'null'",e.getMessage()); }
+ catch( Exception e ) { assertEquals("Syntax error, expected ;: .",e.getMessage()); }
}
@Test
@@ -349,7 +349,7 @@ s0 v1 = v0;
return v1;
""");
code.parse().opto();
- assertEquals("return (const)s0;", code.print());
+ assertEquals("return s0;", code.print());
}
diff --git a/src/test/java/com/seaofnodes/simple/Chapter11Test.java b/src/test/java/com/seaofnodes/simple/Chapter11Test.java
index f6539ac4..4f70913d 100644
--- a/src/test/java/com/seaofnodes/simple/Chapter11Test.java
+++ b/src/test/java/com/seaofnodes/simple/Chapter11Test.java
@@ -20,7 +20,7 @@ while(---- -arg) {
}
}
{
- int kzEl_r7EYz=3*----0!=-arg<(37*--97!=0/arg==arg)<=-(--arg!=0);
+ int kzEl_r7EYz = (3*----0!=-arg) < (37*--97!=0/arg==arg) <= -(--arg!=0);
while(kzEl_r7EYz<---1) {
kzEl_r7EYz=kzEl_r7EYz+kzEl_r7EYz*arg>=24;
if(7) continue;
diff --git a/src/test/java/com/seaofnodes/simple/Chapter13Test.java b/src/test/java/com/seaofnodes/simple/Chapter13Test.java
index a19f85e3..4e1db3b4 100644
--- a/src/test/java/com/seaofnodes/simple/Chapter13Test.java
+++ b/src/test/java/com/seaofnodes/simple/Chapter13Test.java
@@ -40,22 +40,22 @@ return head.next.i;
public void testLinkedList1() {
CodeGen code = new CodeGen(
"""
-struct LLI { LLI? next; int i; };
+struct LLI { LLI? next; int q; };
LLI? !head = null;
while( arg ) {
LLI !x = new LLI;
x.next = head;
- x.i = arg;
+ x.q = arg;
head = x;
arg = arg-1;
}
if( !head ) return 0;
LLI? next = head.next;
if( next==null ) return 1;
-return next.i;
+return next.q;
""");
- code.parse().opto();
- assertEquals("return Phi(Region,0,1,.i);", code.print());
+ code.parse().opto().typeCheck();
+ assertEquals("return Phi(Region,0,1,.q);", code.print());
assertEquals("2", Eval2.eval(code, 3));
}
@@ -108,10 +108,10 @@ return n.next;
"""
struct M { int m; };
struct N { M next; int i; };
-N n = new N { next = null; }
+N n = new N { next = null; };
return n.next;
""");
- try { code.parse().opto(); fail(); }
+ try { code.parse().opto().typeCheck(); fail(); }
catch( Exception e ) { assertEquals("Type null is not of declared type *M",e.getMessage()); }
}
@@ -124,15 +124,15 @@ N !n = new N;
n.i = 3.14;
return n.i;
""");
- try { code.parse().opto(); fail(); }
- catch( Exception e ) { assertEquals("Type 3.14 is not of declared type int",e.getMessage()); }
+ try { code.parse().opto().typeCheck(); fail(); }
+ catch( Exception e ) { assertEquals("Type 3.14 is not of declared type i64",e.getMessage()); }
}
@Test
public void testNullRef4() {
CodeGen code = new CodeGen("return -null-5/null-5;");
try { code.parse().opto().typeCheck(); fail(); }
- catch( Exception e ) { assertEquals("Cannot '+' null",e.getMessage()); }
+ catch( Exception e ) { assertEquals("Cannot '//' null",e.getMessage()); }
}
@Test public void testNullRef5() {
@@ -180,7 +180,7 @@ return new S1.s=new S2;
public void testcheckNull() {
CodeGen code = new CodeGen(
"""
-struct I {int i;};
+struct I { int i; };
struct P { I? pi; };
P !p1 = new P;
P !p2 = new P;
@@ -197,32 +197,52 @@ return p1.pi.i + 1;
public void testCoRecur2() {
CodeGen code = new CodeGen(
"""
-struct A { L? a; T? b; F? c; }; A? !a = new A;
-struct B { M? a; U? b; G? c; }; B? !b = new B;
-struct C { N? a; V? b; H? c; }; C? !c = new C;
-struct D { O? a; W? b; I? c; }; D? !d = new D;
-struct E { P? a; X? b; J? c; }; E? !e = new E;
-struct F { Q? a; Y? b; K? c; }; F? !f = new F;
-struct G { R? a; Z? b; L? c; }; G? !g = new G;
-struct H { S? a; A? b; M? c; }; H? !h = new H;
-struct I { T? a; B? b; N? c; }; I? !i = new I;
-struct J { U? a; C? b; O? c; }; J? !j = new J;
-struct K { V? a; D? b; P? c; }; K? !k = new K;
-struct L { W? a; E? b; Q? c; }; L? !l = new L;
-struct M { X? a; F? b; R? c; }; M? !m = new M;
-struct N { Y? a; G? b; S? c; }; N? !n = new N;
-struct O { Z? a; H? b; T? c; }; O? !o = new O;
-struct P { A? a; I? b; U? c; }; P? !p = new P;
-struct Q { B? a; J? b; V? c; }; Q? !q = new Q;
-struct R { C? a; K? b; W? c; }; R? !r = new R;
-struct S { D? a; L? b; X? c; }; S? !s = new S;
-struct T { E? a; M? b; Y? c; }; T? !t = new T;
-struct U { F? a; N? b; Z? c; }; U? !u = new U;
-struct V { G? a; O? b; A? c; }; V? !v = new V;
-struct W { H? a; P? b; B? c; }; W? !w = new W;
-struct X { I? a; Q? b; C? c; }; X? !x = new X;
-struct Y { J? a; R? b; D? c; }; Y? !y = new Y;
-struct Z { K? a; S? b; E? c; }; Z? !z = new Z;
+struct A { B? f0; C? f1; }; A !a = new A;
+struct B { C? f0; A? f1; }; B !b = new B;
+struct C { A? f0; B? f1; }; C !c = new C;
+
+a.f0=b; a.f1=c;
+b.f0=c; b.f1=a;
+c.f0=a; c.f1=b;
+
+return a.f0.f1.f0.f1.f0;
+
+""");
+ code.parse().opto().typeCheck().GCM().localSched();
+ assertEquals("return B;", code._stop.toString());
+ assertEquals("B{f0=C},f1=A{f0=$cyclic,f1=$cyclic}}", Eval2.eval(code, 0));
+ }
+
+ @Test
+ public void testCoRecur3() {
+ CodeGen code = new CodeGen(
+"""
+struct A { L? a; T? b; F? c; }; A !a = new A;
+struct B { M? a; U? b; G? c; }; B !b = new B;
+struct C { N? a; V? b; H? c; }; C !c = new C;
+struct D { O? a; W? b; I? c; }; D !d = new D;
+struct E { P? a; X? b; J? c; }; E !e = new E;
+struct F { Q? a; Y? b; K? c; }; F !f = new F;
+struct G { R? a; Z? b; L? c; }; G !g = new G;
+struct H { S? a; A? b; M? c; }; H !h = new H;
+struct I { T? a; B? b; N? c; }; I !i = new I;
+struct J { U? a; C? b; O? c; }; J !j = new J;
+struct K { V? a; D? b; P? c; }; K !k = new K;
+struct L { W? a; E? b; Q? c; }; L !l = new L;
+struct M { X? a; F? b; R? c; }; M !m = new M;
+struct N { Y? a; G? b; S? c; }; N !n = new N;
+struct O { Z? a; H? b; T? c; }; O !o = new O;
+struct P { A? a; I? b; U? c; }; P !p = new P;
+struct Q { B? a; J? b; V? c; }; Q !q = new Q;
+struct R { C? a; K? b; W? c; }; R !r = new R;
+struct S { D? a; L? b; X? c; }; S !s = new S;
+struct T { E? a; M? b; Y? c; }; T !t = new T;
+struct U { F? a; N? b; Z? c; }; U !u = new U;
+struct V { G? a; O? b; A? c; }; V !v = new V;
+struct W { H? a; P? b; B? c; }; W !w = new W;
+struct X { I? a; Q? b; C? c; }; X !x = new X;
+struct Y { J? a; R? b; D? c; }; Y !y = new Y;
+struct Z { K? a; S? b; E? c; }; Z !z = new Z;
a.a=l; a.b=t; a.c=f;
b.a=m; b.b=u; b.c=g;
@@ -256,7 +276,6 @@ return a.b.c.a.b.c.a.b.c.a.b.c.a.b.c.a.b.c;
""");
code.parse().opto().typeCheck().GCM().localSched();
assertEquals("return R;", code._stop.toString());
- assertEquals("R{a=C{a=N{a=Y{a=J{a=U{a=F{a=Q{a=B{a=M{a=X{a=I{a=T{a=E{a=P{a=A{a=L{a=W{a=H{a=S{a=D{a=O{a=Z{a=K{a=V{a=G{a=$cyclic,b=$cyclic,c=$cyclic},b=$cyclic,c=$cyclic},b=$cyclic,c=$cyclic},b=$cyclic,c=$cyclic},b=$cyclic,c=$cyclic},b=$cyclic,c=$cyclic},b=$cyclic,c=$cyclic},b=$cyclic,c=$cyclic},b=$cyclic,c=$cyclic},b=$cyclic,c=$cyclic},b=$cyclic,c=$cyclic},b=$cyclic,c=$cyclic},b=$cyclic,c=$cyclic},b=$cyclic,c=$cyclic},b=$cyclic,c=$cyclic},b=$cyclic,c=$cyclic},b=$cyclic,c=$cyclic},b=$cyclic,c=$cyclic},b=$cyclic,c=$cyclic},b=$cyclic,c=$cyclic},b=$cyclic,c=$cyclic},b=$cyclic,c=$cyclic},b=$cyclic,c=$cyclic},b=$cyclic,c=$cyclic},b=$cyclic,c=$cyclic},b=$cyclic,c=$cyclic}", Eval2.eval(code, 0));
+ assertEquals("R{a=C{a=N},b=V},c=H}},b=K{a=$cyclic,b=D{a=O},b=W},c=I}},c=P}},c=$cyclic}", Eval2.eval(code, 0));
}
-
}
diff --git a/src/test/java/com/seaofnodes/simple/Chapter15Test.java b/src/test/java/com/seaofnodes/simple/Chapter15Test.java
index a98e62d8..6ba4e2b1 100644
--- a/src/test/java/com/seaofnodes/simple/Chapter15Test.java
+++ b/src/test/java/com/seaofnodes/simple/Chapter15Test.java
@@ -5,6 +5,7 @@ import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import org.junit.Test;
+import org.junit.Ignore;
import static org.junit.Assert.*;
public class Chapter15Test {
@@ -49,7 +50,7 @@ output[i] = 1;
return output;
""");
code.parse().opto();
- assertEquals("return [u8];", code.print());
+ assertEquals("return []u8;", code.print());
assertEquals("\u0001", Eval2.eval(code, 0));
}
@@ -101,8 +102,8 @@ A?[] !a = new A?[2];
return a;
""");
code.parse().opto();
- assertEquals("return [*A?];", code.print());
- assertEquals("*A {int !i; }?[ null,null]", Eval2.eval(code, 0));
+ assertEquals("return []*A?;", code.print());
+ assertEquals("*A {i64 !i; }?[ null,null]", Eval2.eval(code, 0));
}
@Test
@@ -174,7 +175,7 @@ return root;
""");
code.parse().opto();
assertEquals("return Tree;", code.print());
- assertEquals("Tree{_kids=*Tree?[ Tree{_kids=null},null]}", Eval2.eval(code, 0));
+ assertEquals("Tree{_kids=*Tree {*[]*Tree?? !_kids; }?[ Tree{_kids=null},null]}", Eval2.eval(code, 0));
}
@Test
@@ -212,12 +213,12 @@ return ary[1] * 1000 + ary[3]; // 1 * 1000 + 6
assertEquals("1006", Eval2.eval(code, 4));
}
- @Test
+ @Test @Ignore
public void sieveOEratosthenes() throws IOException {
String src = Files.readString(Path.of("src/test/java/com/seaofnodes/simple/progs/sieve.smp"));
CodeGen code = new CodeGen(src+"return sieve(arg);");
code.parse().opto();
- assertEquals("return [u32];", code.print());
+ assertEquals("return []u32;", code.print());
assertEquals("u32[ 2,3,5,7,11,13,17,19]",Eval2.eval(code, 20));
}
@@ -254,9 +255,10 @@ return new flt;
CodeGen code = new CodeGen(
"""
flt is = new int[2];
+return is;
""");
- try { code.parse().opto(); fail(); }
- catch( Exception e ) { assertEquals("Type *[int] is not of declared type flt",e.getMessage()); }
+ try { code.parse().opto().typeCheck(); fail(); }
+ catch( Exception e ) { assertEquals("Type *[]i64 is not of declared type flt",e.getMessage()); }
}
@Test
diff --git a/src/test/java/com/seaofnodes/simple/Chapter16Test.java b/src/test/java/com/seaofnodes/simple/Chapter16Test.java
index 58bb4148..2623fee5 100644
--- a/src/test/java/com/seaofnodes/simple/Chapter16Test.java
+++ b/src/test/java/com/seaofnodes/simple/Chapter16Test.java
@@ -1,8 +1,6 @@
package com.seaofnodes.simple;
import com.seaofnodes.simple.codegen.CodeGen;
-import com.seaofnodes.simple.evaluator.Evaluator;
-import com.seaofnodes.simple.node.StopNode;
import org.junit.Test;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.fail;
@@ -115,7 +113,7 @@ Point p = new Point { x=3; y=4; };
return p;
""");
code.parse().opto();
- assertEquals("return (const)Point;", code.print());
+ assertEquals("return Point;", code.print());
assertEquals("Point{x=3,y=4}", Eval2.eval(code, 0));
}
@@ -123,24 +121,24 @@ return p;
public void testStructFinal1() {
CodeGen code = new CodeGen("""
struct Point { int x=3, y=4; };
-Point p = new Point { x=5; y=6; };
+val p = new Point { x=5; y=6; };
p.x++;
return p;
""");
try { code.parse().opto().typeCheck(); fail(); }
- catch( Exception e ) { assertEquals("Cannot reassign final 'x'",e.getMessage()); }
+ catch( Exception e ) { assertEquals("Cannot modify final field 'x'",e.getMessage()); }
}
@Test
public void testStructFinal2() {
CodeGen code = new CodeGen("""
struct Point { int x=3, y=4; };
-Point p = new Point;
+val p = new Point;
p.x++;
return p;
""");
try { code.parse().opto().typeCheck(); fail(); }
- catch( Exception e ) { assertEquals("Cannot reassign final 'x'",e.getMessage()); }
+ catch( Exception e ) { assertEquals("Cannot modify final field 'x'",e.getMessage()); }
}
@Test
@@ -163,8 +161,8 @@ Point p = new Point;
p.x++;
return p;
""");
- try { code.parse().opto(); fail(); }
- catch( Exception e ) { assertEquals("Cannot reassign final 'x'",e.getMessage()); }
+ try { code.parse().opto().typeCheck(); fail(); }
+ catch( Exception e ) { assertEquals("Cannot modify final field 'x'",e.getMessage()); }
}
@Test
diff --git a/src/test/java/com/seaofnodes/simple/Chapter17Test.java b/src/test/java/com/seaofnodes/simple/Chapter17Test.java
index bdeb645c..53c23ecd 100644
--- a/src/test/java/com/seaofnodes/simple/Chapter17Test.java
+++ b/src/test/java/com/seaofnodes/simple/Chapter17Test.java
@@ -123,8 +123,8 @@ return s.x;
@Test public void testInt10() {
CodeGen code = new CodeGen("flt x = 1.5; x++; int i = x; return i;");
- try { code.parse().opto(); fail(); }
- catch( Exception e ) { assertEquals("Type 2.5f is not of declared type int",e.getMessage()); }
+ try { code.parse().opto().typeCheck(); fail(); }
+ catch( Exception e ) { assertEquals("Type 2.5f is not of declared type i64",e.getMessage()); }
}
@@ -170,15 +170,15 @@ return s.x;
}
@Test public void testVar6() {
- CodeGen code = new CodeGen("struct S{int x;}; S s=new S; s.x++; return s.x; // Error initializer so x is immutable ");
+ CodeGen code = new CodeGen("struct S{int x;}; val s = new S; s.x++; return s.x; // Error initializer so x is immutable ");
try { code.parse().opto().typeCheck(); fail(); }
- catch( Exception e ) { assertEquals("Cannot reassign final 'x'",e.getMessage()); }
+ catch( Exception e ) { assertEquals("Cannot modify final field 'x'",e.getMessage()); }
}
@Test public void testVar7() {
- CodeGen code = new CodeGen("struct S{int x;}; S s=new S{x=3;}; s.x++; return s.x; // Error initializer so x is immutable ");
+ CodeGen code = new CodeGen("struct S{int x;}; val s = new S{x=3;}; s.x++; return s.x; // Error initializer so x is immutable ");
try { code.parse().opto().typeCheck(); fail(); }
- catch( Exception e ) { assertEquals("Cannot reassign final 'x'",e.getMessage()); }
+ catch( Exception e ) { assertEquals("Cannot modify final field 'x'",e.getMessage()); }
}
@Test public void testVar8() {
@@ -198,7 +198,7 @@ return s.x;
@Test public void testVar10() {
CodeGen code = new CodeGen("struct S{int x;}; val s=new S; s.x++; return s.x; // Error, has val so x is immutable ");
try { code.parse().opto().typeCheck(); fail(); }
- catch( Exception e ) { assertEquals("Cannot reassign final 'x'",e.getMessage()); }
+ catch( Exception e ) { assertEquals("Cannot modify final field 'x'",e.getMessage()); }
}
@Test public void testVar11() {
@@ -214,9 +214,10 @@ foo.bar.x++; // Ok foo and foo.bar and foo.bar.x are all mutable
val xfoo = foo; // Throw away mutability
xfoo.bar.x++; // Error, cannot mutate through xfoo
+return xfoo.bar.x;
""");
try { code.parse().opto().typeCheck(); fail(); }
- catch( Exception e ) { assertEquals("Cannot reassign final 'x'",e.getMessage()); }
+ catch( Exception e ) { assertEquals("Cannot modify final field 'x'",e.getMessage()); }
}
@Test public void testVar12() {
@@ -274,7 +275,7 @@ return new A {
if (arg) b = new B; // Constructor ends with partial init of b
}.b;
""");
- try { code.parse().opto(); fail(); }
+ try { code.parse(); fail(); }
catch( Exception e ) { assertEquals("'A' is not fully initialized, field 'b' needs to be set in a constructor",e.getMessage()); }
}
@@ -307,7 +308,7 @@ focus(me);
return me;
"""
);
- try { code.parse().opto().typeCheck(); fail(); }
+ try { code.parse(); fail(); }
catch( Exception e ) { assertEquals("Syntax error, expected =expression: ;",e.getMessage()); }
}
@@ -491,15 +492,15 @@ return new A;
@Test
public void testForward1() {
CodeGen code = new CodeGen("""
-struct A{
+struct A {
B?[]? nil_array_of_b;
- B?[] not_array_of_b = new B?[0];
+ B?[] array_of_b;
};
-return new A.not_array_of_b;
+return new A{array_of_b = new B?[0]; }.array_of_b;
""");
code.parse().opto();
- assertEquals("return (const)[*B?];", code.print());
- assertEquals("*B?[]", Eval2.eval(code,0));
+ assertEquals("return (const)[]*B?;", code.print());
+ assertEquals("*B {... }?[]", Eval2.eval(code,0));
}
// ---------------------------------------------------------------
@@ -548,8 +549,8 @@ for( int j=0; j<nprimes; j++ )
return rez;
""");
code.parse().opto().typeCheck().GCM();
- assertEquals("return [int];", code.print());
- assertEquals("int[ 2,3,5,7,11,13,17,19]",Eval2.eval(code, 20));
+ assertEquals("return []i64;", code.print());
+ assertEquals("i64[ 2,3,5,7,11,13,17,19]",Eval2.eval(code, 20));
}
}
diff --git a/src/test/java/com/seaofnodes/simple/Chapter18Test.java b/src/test/java/com/seaofnodes/simple/Chapter18Test.java
index 00d41a23..42f80d86 100644
--- a/src/test/java/com/seaofnodes/simple/Chapter18Test.java
+++ b/src/test/java/com/seaofnodes/simple/Chapter18Test.java
@@ -64,7 +64,7 @@ return x2;
};
""");
code.parse().opto();
- assertEquals("return (Parm_x(sq,int)*x);", code._stop.toString());
+ assertEquals("return (Parm_x(sq,i64)*x);", code._stop.toString());
//assertEquals("{ int -> int #1}", Eval2.eval(code, 3));
}
@@ -78,7 +78,7 @@ var sq = { int x ->
return sq(arg)+sq(3);
""");
code.driver(Phase.LocalSched);
- assertEquals("Stop[ return (Parm_x(sq,int)*x); return (#2+#2); ]", code._stop.toString());
+ assertEquals("Stop[ return (#2+#2); return (Parm_x(sq,i64)*x); ]", code._stop.toString());
assertEquals("13", Eval2.eval(code, 2));
}
@@ -116,7 +116,7 @@ var fcn = arg ? { int x -> x*x; } : { int x -> x+x; };
return fcn(3);
""");
code.parse().opto();
- assertEquals("Stop[ return (Parm_x($fun2,int,3)<<1); return (Parm_x($fun1,int,3)*x); return #2; ]", code._stop.toString());
+ assertEquals("Stop[ return #2; return (Parm_x($fun21,i64,3)*x); return (Parm_x($fun22,i64,3)<<1); ]", code._stop.toString());
assertEquals("6", Eval2.eval(code, 0));
assertEquals("9", Eval2.eval(code, 1));
}
@@ -126,7 +126,7 @@ return fcn(3);
public void testFcn5() {
CodeGen code = new CodeGen("val fact = { int x -> x <= 1 ? 1 : x*fact(x-1); }; return fact(arg);");
code.parse().opto().typeCheck();
- assertEquals("Stop[ return Phi(Region,1,(Parm_x(fact,int,arg,(x-1))*#2)); return #2; ]", code._stop.toString());
+ assertEquals("Stop[ return #2; return Phi(Region,1,(Parm_x(fact,i64,arg,(x-1))*#2)); ]", code._stop.toString());
assertEquals( "1", Eval2.eval(code, 0));
assertEquals( "1", Eval2.eval(code, 1));
assertEquals( "2", Eval2.eval(code, 2));
@@ -158,7 +158,7 @@ val g = {->2;};
return 2;
""");
code.parse().opto().typeCheck().GCM();
- assertEquals("Stop[ return 2; return 1; return 1; ]", code._stop.toString());
+ assertEquals("Stop[ return 1; return 1; return 2; ]", code._stop.toString());
assertEquals("1", Eval2.eval(code, 0));
}
@@ -176,7 +176,7 @@ for(;;) {
}
""");
code.driver(Phase.LocalSched);
- assertEquals("Stop[ return Parm_i(x,int); return #2; ]", code._stop.toString());
+ assertEquals("Stop[ return #2; return Parm_i(x,i64); ]", code._stop.toString());
assertEquals("3", Eval2.eval(code, 0));
}
@@ -252,7 +252,7 @@ for(;;) {
return 0;
""");
try { code.parse().opto().typeCheck(); fail(); }
- catch( Exception e ) { assertEquals("Might be null calling { int -> int #1}?",e.getMessage()); }
+ catch( Exception e ) { assertEquals("Might be null calling { i64 -> i64 #21}?",e.getMessage()); }
}
@@ -348,7 +348,7 @@ if (i2i) return i2i(arg);
return f2f(o)(1);
""");
code.driver(Phase.LocalSched);
- assertEquals("Stop[ return Parm_i(i2i.o,int); return Phi(Region,#2,#2); ]", code._stop.toString());
+ assertEquals("Stop[ return Phi(Region,#2,#2); return Parm_i(i2i.o,i64); ]", code._stop.toString());
assertEquals("1", Eval2.eval(code, 2));
}
diff --git a/src/test/java/com/seaofnodes/simple/Chapter19Test.java b/src/test/java/com/seaofnodes/simple/Chapter19Test.java
index b8ef22d7..e2a155ce 100644
--- a/src/test/java/com/seaofnodes/simple/Chapter19Test.java
+++ b/src/test/java/com/seaofnodes/simple/Chapter19Test.java
@@ -303,7 +303,7 @@ return A[1];
public void sieveOfEratosthenes() throws IOException {
String src = Files.readString(Path.of("src/test/java/com/seaofnodes/simple/progs/sieve.smp"));
CodeGen code = new CodeGen(src).driver(Phase.LocalSched,"x86_64_v2", "SystemV");
- assertEquals("return [u32];", code.print());
+ assertEquals("return []u32;", code.print());
//assertEquals("u32[ 2,3,5,7,11,13,17,19]",Eval2.eval(code, 20));
}
@@ -316,7 +316,7 @@ val fcn = arg ? { int x -> x*x; } : { int x -> x+x; };
return fcn(2)*10 + fcn(3);
""");
code.driver(Phase.LocalSched,"x86_64_v2", "SystemV");
- assertEquals("Stop[ return (shli,Parm_x($fun2,int)); return (mul,Parm_x($fun1,int),x); return (add,#2,(muli,#2)); ]", code.print());
+ assertEquals("Stop[ return (add,#2,(muli,#2)); return (mul,Parm_x($fun21,i64),x); return (shli,Parm_x($fun22,i64)); ]", code.print());
}
@Test
@@ -327,6 +327,6 @@ val sq = { int x -> x*x; };
return sq(arg) + sq(3);
""");
code.driver(Phase.LocalSched,"x86_64_v2", "SystemV");
- assertEquals("Stop[ return (mul,Parm_x(sq,int),x); return (add,#2,#2); ]", code.print());
+ assertEquals("Stop[ return (add,#2,#2); return (mul,Parm_x(sq,i64),x); ]", code.print());
}
}
diff --git a/src/test/java/com/seaofnodes/simple/Chapter20Test.java b/src/test/java/com/seaofnodes/simple/Chapter20Test.java
index f442ae1a..dcea5c87 100644
--- a/src/test/java/com/seaofnodes/simple/Chapter20Test.java
+++ b/src/test/java/com/seaofnodes/simple/Chapter20Test.java
@@ -38,9 +38,9 @@ public class Chapter20Test {
}
@Test public void testAlloc0() {
- testCPU("return new u8[arg];","x86_64_v2", "SystemV",3,"return [u8];");
- testCPU("return new u8[arg];","riscv" , "SystemV",5,"return [u8];");
- testCPU("return new u8[arg];","arm" , "SystemV",5,"return [u8];");
+ testCPU("return new u8[arg];","x86_64_v2", "SystemV",3,"return []u8;");
+ testCPU("return new u8[arg];","riscv" , "SystemV",5,"return []u8;");
+ testCPU("return new u8[arg];","arm" , "SystemV",5,"return []u8;");
}
@Test public void testBasic1() {
@@ -103,7 +103,7 @@ return sqrt(arg) + sqrt(cast_int);
public void testString() throws IOException {
String src = Files.readString(Path.of("src/test/java/com/seaofnodes/simple/progs/stringHash.smp"));
testCPU(src,"x86_64_v2", "SystemV", 9,null);
- testCPU(src,"riscv" , "SystemV", 5,null);
+ testCPU(src,"riscv" , "SystemV", 3,null);
testCPU(src,"arm" , "SystemV", 3,null);
}
diff --git a/src/test/java/com/seaofnodes/simple/Chapter21Test.java b/src/test/java/com/seaofnodes/simple/Chapter21Test.java
index 77d1e337..7f4898e0 100644
--- a/src/test/java/com/seaofnodes/simple/Chapter21Test.java
+++ b/src/test/java/com/seaofnodes/simple/Chapter21Test.java
@@ -3,6 +3,7 @@ package com.seaofnodes.simple;
import com.seaofnodes.simple.codegen.CodeGen;
import com.seaofnodes.simple.node.cpus.arm.arm;
import com.seaofnodes.simple.node.cpus.riscv.riscv;
+import com.seaofnodes.simple.util.SB;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
@@ -12,7 +13,7 @@ import static org.junit.Assert.*;
public class Chapter21Test {
- @Test @Ignore
+ @Test
public void testJig() throws IOException {
String src = Files.readString(Path.of("src/test/java/com/seaofnodes/simple/progs/jig.smp"));
testCPU(src,"x86_64_v2", "Win64" ,-1,null);
@@ -65,7 +66,7 @@ public class Chapter21Test {
public void testString() throws IOException {
String src = Files.readString(Path.of("src/test/java/com/seaofnodes/simple/progs/stringHash.smp"));
testCPU(src,"x86_64_v2", "SystemV", 9,null);
- testCPU(src,"riscv" , "SystemV", 5,null);
+ testCPU(src,"riscv" , "SystemV", 3,null);
testCPU(src,"arm" , "SystemV", 3,null);
}
diff --git a/src/test/java/com/seaofnodes/simple/Chapter22Test.java b/src/test/java/com/seaofnodes/simple/Chapter22Test.java
index 394ba336..f6410b6a 100644
--- a/src/test/java/com/seaofnodes/simple/Chapter22Test.java
+++ b/src/test/java/com/seaofnodes/simple/Chapter22Test.java
@@ -13,7 +13,7 @@ import static org.junit.Assert.*;
public class Chapter22Test {
- @Test @Ignore
+ @Test
public void testJig() throws IOException {
String src = Files.readString(Path.of("src/test/java/com/seaofnodes/simple/progs/jig.smp"));
//String src = Files.readString(Path.of("docs/examples/BubbleSort.smp"));
@@ -180,7 +180,7 @@ return cc.cz;
@Test
public void testHelloWorld() throws IOException {
String src = Files.readString(Path.of("src/test/java/com/seaofnodes/simple/progs/helloWorld.smp"));
- TestC.run(src,TestC.CALL_CONVENTION,null,null,"build/objs/helloWorld","","Hello, World!",0);
+ TestC.run(src,TestC.CALL_CONVENTION,null, null,null,"build/objs/helloWorld","","Hello, World!",0);
// Evaluate on RISC5 emulator
EvalRisc5 R5 = TestRisc5.build("helloWorld", 0, 2, false);
@@ -221,7 +221,7 @@ return sum(is);
@Test @Ignore
public void testEcho() throws IOException {
String src = Files.readString(Path.of("src/test/java/com/seaofnodes/simple/progs/echo.smp"));
- TestC.run(src,TestC.CALL_CONVENTION,null,null,"build/objs/echo","","",0);
+ TestC.run(src,TestC.CALL_CONVENTION,null, null,null,"build/objs/echo","","",0);
// Evaluate on RISC5 emulator
EvalRisc5 R5 = TestRisc5.build("echo", 0, 2, false);
diff --git a/src/test/java/com/seaofnodes/simple/Chapter23Test.java b/src/test/java/com/seaofnodes/simple/Chapter23Test.java
new file mode 100644
index 00000000..9d500266
--- /dev/null
+++ b/src/test/java/com/seaofnodes/simple/Chapter23Test.java
@@ -0,0 +1,249 @@
+package com.seaofnodes.simple;
+
+import com.seaofnodes.simple.codegen.CodeGen;
+import com.seaofnodes.simple.node.cpus.riscv.riscv;
+import com.seaofnodes.simple.type.TypeInteger;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import org.junit.Ignore;
+import org.junit.Test;
+import static org.junit.Assert.*;
+
+public class Chapter23Test {
+
+ @Test
+ public void testJig() throws IOException {
+ String src =
+"""
+var apply = { i64 x, { i64 -> u32 } fcn ->
+ return fcn(x);
+}
+""";
+ }
+
+ @Test @Ignore
+ public void myOwnSake2() throws IOException {
+ TestC.runS("print","Or",0);
+ }
+
+ static CodeGen testCPU( String src, String cpu, String os, int spills, String stop ) {
+ CodeGen code = new CodeGen(src).driver(CodeGen.Phase.Encoding,cpu,os);
+ int delta = spills>>3;
+ if( delta==0 ) delta = 1;
+ if( spills != -1 )
+ assertEquals("Expect spills:",spills,code._regAlloc._spillScaled,delta);
+ if( stop != null )
+ assertEquals(stop, code._stop.toString());
+ return code;
+ }
+
+ @Test
+ public void testOr() throws IOException {
+ TestC.runS("or1","Or",0);
+
+ // Evaluate on RISC5 emulator
+ EvalRisc5 R5 = TestRisc5.build("or1", 0, 2, false);
+ int trap = R5.step(100);
+ assertEquals(0,trap);
+ assertEquals(0,R5.regs[riscv.A0]);
+ assertEquals("Or",R5._stdout.toString());
+
+ // Evaluate on ARM emulator
+ EvalArm64 arm = TestArm64.build("or1", 0, 2, false);
+ trap = arm.step(100);
+ assertEquals(0,trap);
+ assertEquals(0,arm.regs[0]);
+ assertEquals("Or",arm._stdout.toString());
+ }
+
+ @Test
+ public void testAnd() throws IOException {
+ TestC.runS("and1","And",0);
+
+ // Evaluate on RISC5 emulator
+ EvalRisc5 R5 = TestRisc5.build("and1", 0, 2, false);
+ int trap = R5.step(100);
+ assertEquals(0,trap);
+ assertEquals(0,R5.regs[riscv.A0]);
+ assertEquals("And",R5._stdout.toString());
+
+ // Evaluate on ARM emulator
+ EvalArm64 arm = TestArm64.build("and1", 0, 2, false);
+ trap = arm.step(100);
+ assertEquals(0,trap);
+ assertEquals(0,arm.regs[0]);
+ assertEquals("And",arm._stdout.toString());
+ }
+
+ @Test
+ public void testAndPtr() throws IOException {
+ String src =
+"""
+struct S { S? fld; };
+val ptr = arg == 1 ? null : new S{fld = arg==1 ? null : new S{fld = null;};};
+return ptr && ptr.fld ? "true" : "false";
+ """;
+ CodeGen code = new CodeGen(src).parse().opto().typeCheck();
+ assertEquals("[97-117][ 116,114,117,101]", Eval2.eval(code, 0));
+
+ // Evaluate on RISC5 emulator
+ EvalRisc5 R5 = TestRisc5.build("ptrand", 1, 8, false);
+ int trap = R5.step(100);
+ assertEquals(0,trap);
+ assertEquals(0,R5.regs[riscv.A0]);
+ assertEquals("false",R5._stdout.toString());
+
+ // Evaluate on ARM emulator
+ EvalArm64 arm = TestArm64.build("ptrand", 1, 8, false);
+ trap = arm.step(100);
+ assertEquals(0,trap);
+ assertEquals(0,arm.regs[0]);
+ assertEquals("false",arm._stdout.toString());
+ }
+
+ // conditional side effect
+ @Test
+ public void testCondSideEffAnd() throws IOException {
+ TestC.runS("and2","Effected",0);
+
+ // Evaluate on RISC5 emulator
+ EvalRisc5 R5 = TestRisc5.build("and2", 0, 2, false);
+ int trap = R5.step(100);
+ assertEquals(0,trap);
+ assertEquals(0,R5.regs[riscv.A0]);
+ assertEquals("Effected",R5._stdout.toString());
+
+ // Evaluate on ARM emulator
+ EvalArm64 arm = TestArm64.build("and2", 0, 2, false);
+ trap = arm.step(100);
+ assertEquals(0,trap);
+ assertEquals(0,arm.regs[0]);
+ assertEquals("Effected",arm._stdout.toString());
+ }
+
+
+ @Test
+ public void testCondSideEffOr() throws IOException {
+ TestC.runS("or2","Effected",0);
+
+ // Evaluate on RISC5 emulator
+ EvalRisc5 R5 = TestRisc5.build("or2", 0, 2, false);
+ int trap = R5.step(100);
+ assertEquals(0,trap);
+ assertEquals(0,R5.regs[riscv.A0]);
+ assertEquals("Effected",R5._stdout.toString());
+
+ // Evaluate on ARM emulator
+ EvalArm64 arm = TestArm64.build("or2", 0, 2, false);
+ trap = arm.step(100);
+ assertEquals(0,trap);
+ assertEquals(0,arm.regs[0]);
+ assertEquals("Effected",arm._stdout.toString());
+ }
+
+ // test it with function calls
+ @Test
+ public void testFuncCall() throws IOException {
+ TestC.runS("and3","Or",0);
+
+ // Evaluate on RISC5 emulator
+ EvalRisc5 R5 = TestRisc5.build("and3", 0, 2, false);
+ int trap = R5.step(100);
+ assertEquals(0,trap);
+ assertEquals(0,R5.regs[riscv.A0]);
+ assertEquals("Or",R5._stdout.toString());
+
+ // Evaluate on ARM emulator
+ EvalArm64 arm = TestArm64.build("and3", 0, 2, false);
+ trap = arm.step(100);
+ assertEquals(0,trap);
+ assertEquals(0,arm.regs[0]);
+ assertEquals("Or",arm._stdout.toString());
+ }
+
+ @Test
+ public void testFRefFields() {
+ String src =
+"""
+// A hypothetical scanner class
+struct Scan {
+ int !x;
+ u8[~] buf;
+ // Skip whitespace
+ val skip = { Scan s ->
+ while( s.buf[s.x] <= ' ' )
+ s.x++;
+ };
+ // Peek a character; if matched consume it, else false.
+ val peek = { Scan s, u8 c ->
+ skip(s);
+ if( s.buf[s.x] != c ) return false;
+ s.x++;
+ return true;
+ };
+};
+Scan !s = new Scan{ buf = " q"; };
+return Scan.peek(s,'q');
+ """;
+
+ CodeGen code = new CodeGen(src).parse().opto().typeCheck();
+ assertEquals("return Phi(Region,0,1);", code._stop.toString());
+ assertEquals("1", Eval2.eval(code, 0));
+ testCPU(src,"x86_64_v2", "Win64" ,17,null);
+ };
+
+ @Test
+ public void testFRefFields2() {
+ String src =
+"""
+// A hypothetical scanner class
+struct Scan {
+ int !x;
+ u8[~] buf;
+ // Skip whitespace
+ val skip = { ->
+ while( buf[x] <= ' ' )
+ x++;
+ return self;
+ };
+};
+val s = new Scan{ buf = " q"; };
+return s.skip().x;
+ """;
+
+ try { new CodeGen(src).parse().opto().typeCheck(); fail(); }
+ catch( Exception e ) { assertEquals("Argument #0 isa *Scan {i64 x; *[]u8 buf; { *Scan -> *Scan {i64 !x; *[]u8 buf; {21} skip; } #21} skip; }, but must be a *Scan {i64 !x; *[]u8 buf; ... }",e.getMessage()); }
+ };
+
+
+ @Test
+ public void testMethod() {
+ String src =
+"""
+// A hypothetical scanner class
+struct Scan {
+ int !x;
+ u8[~] buf;
+ // Skip whitespace
+ val skip = { ->
+ while( buf[x] <= ' ' )
+ x++;
+ };
+ val require = { u8 ch ->
+ skip();
+ buf[x++]==ch;
+ };
+};
+Scan !s = new Scan{ buf = " [1,2]"; };
+return s.require('[');
+ """;
+
+ CodeGen code = new CodeGen(src).parse().opto().typeCheck();
+ assertEquals("return (.[]==91);", code._stop.toString());
+ assertEquals("1", Eval2.eval(code, 0));
+ testCPU(src,"x86_64_v2", "Win64" ,16,null);
+ };
+
+
+}
diff --git a/src/test/java/com/seaofnodes/simple/Eval2.java b/src/test/java/com/seaofnodes/simple/Eval2.java
index 86f0e9db..094b5143 100644
--- a/src/test/java/com/seaofnodes/simple/Eval2.java
+++ b/src/test/java/com/seaofnodes/simple/Eval2.java
@@ -4,6 +4,8 @@ import com.seaofnodes.simple.codegen.CodeGen;
import com.seaofnodes.simple.node.*;
import com.seaofnodes.simple.print.IRPrinter;
import com.seaofnodes.simple.type.*;
+import com.seaofnodes.simple.util.SB;
+import com.seaofnodes.simple.util.Utils;
import java.util.*;
public abstract class Eval2 {
@@ -115,7 +117,7 @@ public abstract class Eval2 {
public static String eval( CodeGen code, long arg ) { return eval(code,arg,1000); }
public static String eval( CodeGen code, long arg, int timeout ) {
if( code._start.uctrl()==null ) return ""; // The empty program
- SB trace = null; // new SB(); // TRACE, set to null for off, new SB() for on
+ SB trace = null; // = new SB(); // TRACE, set to null for off, new SB() for on
// Force local scheduling phase
code.driver(CodeGen.Phase.LocalSched);
// Set global, so don't have to pass everywhere
@@ -302,9 +304,20 @@ public abstract class Eval2 {
return switch ( t ) {
case TypeInteger i -> i.isConstant() ? (Long )i.value() : "INT";
case TypeFloat f -> f.isConstant() ? (Double)f.value() : "FLT";
- case TypeMemPtr tmp -> tmp;
case TypeFunPtr tfp -> tfp;
case TypeMem mem -> "MEM";
+ case TypeMemPtr tmp -> {
+ if( tmp._obj.isAry() ) { // Constant array ptr
+ TypeConAry con = (TypeConAry)tmp._obj.field("[]")._t;
+ Object[] xs = new Object[con.len()];
+ for( int i=0; i<con.len(); i++ )
+ xs[i] = con.at8(i);
+ yield xs;
+
+ } else {
+ throw Utils.TODO(); // Constant non-array ptr
+ }
+ }
default -> null;
};
}
@@ -313,8 +326,7 @@ public abstract class Eval2 {
private static int offToIdx( long off, TypeStruct t) {
off -= t.aryBase();
int scale = t.aryScale();
- long mask = (1L << scale)-1;
- assert (off & mask) == 0;
+ assert (off & ((1L << scale)-1)) == 0;
return (int)(off>>scale);
}
@@ -328,7 +340,7 @@ public abstract class Eval2 {
if( n!=x || n<0 )
throw new NegativeArraySizeException(""+n);
Object[] ary = new Object[n]; // Array body
- var elem = type._fields[1]._type;
+ var elem = type._fields[1]._t;
if (elem instanceof TypeInteger) {
Arrays.fill( ary, 0L );
} else if (elem instanceof TypeFloat) {
@@ -342,7 +354,7 @@ public abstract class Eval2 {
int num = type._fields.length;
Object[] ptr = new Object[num];
for( int i=0; i<num; i++ )
- ptr[i] = con(type._fields[i]._type.makeZero());
+ ptr[i] = con(type._fields[i]._t.makeZero());
return ptr;
}
@@ -350,11 +362,12 @@ public abstract class Eval2 {
Object f = val(ld.ptr());
// Check for dense constant array
if( f instanceof TypeMemPtr tmp ) {
- assert tmp._obj._con != TypeConAry.BOT;
- if( ld._name.equals("#") )
- return (long)tmp._obj._con.len();
- int idx = offToIdx(x(ld.off()),tmp._obj);
- return tmp._obj._con.at(idx);
+ //assert tmp._obj._con != TypeConAry.BOT;
+ //if( ld._name.equals("#") )
+ // return (long)tmp._obj._con.len();
+ //int idx = offToIdx(x(ld.off()),tmp._obj);
+ //return tmp._obj._con.at(idx);
+ throw Utils.TODO();
}
Object[] fs = (Object[])f;
if( ld._name.equals("#") )
@@ -412,14 +425,11 @@ public abstract class Eval2 {
case TypeMemPtr tmp -> {
if( visit.containsKey(x) ) yield sb.p("$cyclic");
visit.put(x,x);
- // Since never can close the type cycle, without cyclic types, have
- // to handle FRefs even here
- if( tmp.isFRef() )
- tmp = tmp.makeFrom(((TypeMemPtr)Parser.TYPES.get(tmp._obj._name))._obj);
+ assert !tmp.isFRef();
Object[] xs = (Object[])x; // Array of fields
if( tmp._obj.isAry() ) {
- Type elem = tmp._obj._fields[1]._type;
+ Type elem = tmp._obj._fields[1]._t;
if( elem == TypeInteger.U8 ) {
// Shortcut u8[] as a String
for( Object o : xs )
@@ -427,6 +437,7 @@ public abstract class Eval2 {
} else {
// Array of elements
elem.print(sb).p("[ ");
+ if( elem instanceof TypeConAry ) elem = TypeInteger.ZERO;
for( Object o : xs )
_print( elem, o, sb, visit ).p( "," );
sb.unchar().p("]");
@@ -435,7 +446,7 @@ public abstract class Eval2 {
sb.p(tmp._obj._name).p("{");
Field[] flds = tmp._obj._fields;
for( int i=0; i<flds.length; i++ )
- _print( flds[i]._type,xs[i], sb.p(flds[i]._fname).p("="), visit ).p(",");
+ _print( flds[i]._t,xs[i], sb.p(flds[i]._fname).p("="), visit ).p(",");
sb.unchar().p("}");
}
yield sb;
diff --git a/src/test/java/com/seaofnodes/simple/EvalArm64.java b/src/test/java/com/seaofnodes/simple/EvalArm64.java
index 981799bb..c719b8e8 100644
--- a/src/test/java/com/seaofnodes/simple/EvalArm64.java
+++ b/src/test/java/com/seaofnodes/simple/EvalArm64.java
@@ -2,6 +2,7 @@ package com.seaofnodes.simple;
import com.seaofnodes.simple.codegen.Encoding;
import com.seaofnodes.simple.node.cpus.arm.arm;
+import com.seaofnodes.simple.util.Utils;
import java.io.ByteArrayOutputStream;
public class EvalArm64 {
@@ -572,11 +573,16 @@ public class EvalArm64 {
break;
}
case 0xD6: {
+ if( (ir & 0xFFFF) != 0 ) throw Utils.TODO();
+ if( ((ir>>16) & 0xFF) != 0x5F ) throw Utils.TODO(); // 0x3F is register call
rdid = -1;
+ int rn = ir << 22 >> 27;
+ assert rn == 0;
+ pc = (int)regs[30];
// Return to zero breaks simulation
- if(regs[30] == 0)
- break outer;
- throw Utils.TODO();
+ if( pc==0 ) break outer;
+ pc -= 4; // Undo post-increment
+ break;
}
case 0xF1: {
diff --git a/src/test/java/com/seaofnodes/simple/EvalRisc5.java b/src/test/java/com/seaofnodes/simple/EvalRisc5.java
index 0a1c034f..8c0a8792 100644
--- a/src/test/java/com/seaofnodes/simple/EvalRisc5.java
+++ b/src/test/java/com/seaofnodes/simple/EvalRisc5.java
@@ -10,6 +10,7 @@
import com.seaofnodes.simple.codegen.Encoding;
import com.seaofnodes.simple.node.cpus.riscv.riscv;
+import com.seaofnodes.simple.util.Utils;
import java.io.ByteArrayOutputStream;
import java.util.Arrays;
diff --git a/src/test/java/com/seaofnodes/simple/MergeSortTest.java b/src/test/java/com/seaofnodes/simple/MergeSortTest.java
index a1004fb5..65eb525c 100644
--- a/src/test/java/com/seaofnodes/simple/MergeSortTest.java
+++ b/src/test/java/com/seaofnodes/simple/MergeSortTest.java
@@ -2,6 +2,7 @@ package com.seaofnodes.simple;
import com.seaofnodes.simple.codegen.CodeGen;
import com.seaofnodes.simple.node.cpus.riscv.riscv;
+import com.seaofnodes.simple.util.SB;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
diff --git a/src/test/java/com/seaofnodes/simple/Simple.java b/src/test/java/com/seaofnodes/simple/Simple.java
index cc044b6f..f765d939 100644
--- a/src/test/java/com/seaofnodes/simple/Simple.java
+++ b/src/test/java/com/seaofnodes/simple/Simple.java
@@ -2,12 +2,12 @@ package com.seaofnodes.simple;
import com.seaofnodes.simple.codegen.CodeGen;
import com.seaofnodes.simple.print.*;
-
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.io.InputStreamReader;
+import com.seaofnodes.simple.util.Utils;
import java.io.BufferedReader;
import java.io.IOException;
+import java.io.InputStreamReader;
+import java.nio.file.Files;
+import java.nio.file.Path;
import java.util.stream.Collectors;
public class Simple {
diff --git a/src/test/java/com/seaofnodes/simple/TestC.java b/src/test/java/com/seaofnodes/simple/TestC.java
index 93fa9b66..dbe9f02f 100644
--- a/src/test/java/com/seaofnodes/simple/TestC.java
+++ b/src/test/java/com/seaofnodes/simple/TestC.java
@@ -1,6 +1,9 @@
package com.seaofnodes.simple;
import com.seaofnodes.simple.codegen.CodeGen;
+import com.seaofnodes.simple.type.TypeInteger;
+import com.seaofnodes.simple.util.Ary;
+import com.seaofnodes.simple.util.Utils;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
@@ -27,7 +30,7 @@ public abstract class TestC {
}
// Compile and run a simple program
- public static void run( String dir, String file, String expected, int spills ) throws IOException {
+ public static void run( String dir, String file, TypeInteger arg, String expected, int spills, boolean standalone) throws IOException {
// Files
String cfile = dir+"/"+file+".c" ;
String sfile = dir+"/"+file+".smp";
@@ -35,15 +38,28 @@ public abstract class TestC {
// Compile and export Simple
String src = Files.readString(Path.of(sfile));
- run(src,CALL_CONVENTION,"",cfile,efile,"S",expected,spills);
+ run(src,CALL_CONVENTION,arg, "",standalone? null: cfile,efile,"S",expected,spills);
+ }
+ public static void run(String dir, String file, String expected, int spills ) throws IOException {
+ run(dir, file,null, expected, spills, false);
+ }
+
+ public static void runS(String file, String expected, int spills ) throws IOException {
+ run("src/test/java/com/seaofnodes/simple/progs", file, null, expected, spills, true);
}
- public static void run( String src, String simple_conv, String c_conv, String cfile, String efile, String xtn, String expected, int spills ) throws IOException {
+ public static void runS(String file, TypeInteger arg, String expected, int spills ) throws IOException {
+ run("src/test/java/com/seaofnodes/simple/progs", file, arg, expected, spills, true);
+ }
+
+
+ public static void run( String src, String simple_conv, TypeInteger arg, String c_conv, String cfile, String efile, String xtn, String expected, int spills ) throws IOException {
String bin = efile+xtn;
String obj = bin+".o";
String exe = OS.startsWith("Windows") ? bin+".exe" : bin;
// Compile simple, emit ELF
- CodeGen code = new CodeGen(src).driver( CPU_PORT, simple_conv, obj);
+ CodeGen code = new CodeGen(src, arg).driver( CPU_PORT, simple_conv, obj);
+
String result = gcc(obj, c_conv, cfile, false, exe );
assertEquals(expected,result);
diff --git a/src/test/java/com/seaofnodes/simple/TypeTest.java b/src/test/java/com/seaofnodes/simple/TypeTest.java
index 660f984a..0fd56607 100644
--- a/src/test/java/com/seaofnodes/simple/TypeTest.java
+++ b/src/test/java/com/seaofnodes/simple/TypeTest.java
@@ -11,23 +11,25 @@ public class TypeTest {
@Test
public void testTypeAdHoc() {
Assert.assertEquals( Type.BOTTOM, TypeInteger.TRUE.meet(TypeNil.NIL) );
- Assert.assertEquals( Type.BOTTOM, TypeInteger.TOP.meet(TypeNil.NIL) );
-
-
- TypeStruct s1 = TypeStruct.make("s1", new Field[]{
- Field.make("a", TypeInteger.BOT,-1, false),
- Field.make("b", TypeInteger.BOT,-2, false) });
- TypeStruct s2 = TypeStruct.make("s2", new Field[]{
- Field.make("a", TypeInteger.BOT,-3, false),
- Field.make("b", TypeInteger.BOT,-4, false) });
- Assert.assertEquals(s1.makeRO(), s1.glb(false));
+ Assert.assertEquals( Type.BOTTOM, TypeInteger.TOP .meet(TypeNil.NIL) );
+
+ TypeStruct s1 = TypeStruct.make("s1",false,
+ Field.make("a", TypeInteger.BOT,-1, false, false),
+ Field.make("b", TypeInteger.BOT,-2, false, false) );
+ TypeStruct s2 = TypeStruct.make("s2",false,
+ Field.make("a", TypeInteger.BOT,-3, false, false),
+ Field.make("b", TypeInteger.BOT,-4, false, false) );
+ TypeStruct x1ro = (TypeStruct)s1.makeRO();
+ TypeMemPtr p1 = TypeMemPtr.make(s1);
+ Assert.assertEquals(x1ro, ((TypeMemPtr)p1.glb(false))._obj);
Assert.assertNotEquals(s1, s1.dual());
- Assert.assertEquals(s1.makeRO(), s1.dual().glb(false));
+ TypeStruct s1dglb = ((TypeMemPtr)p1.dual().glb(false))._obj;
+ Assert.assertTrue(x1ro.isa(s1dglb));
- TypeMem m1 = TypeMem.make(1,TypeNil.NIL);
- TypeMem m2 = TypeMem.make(2,TypeInteger.U16);
- TypeMem m3 = TypeMem.make(3,TypeFloat.F64);
- TypeMem m4 = TypeMem.make(4,TypeInteger.BOT);
+ TypeMem m1 = TypeMem.make(2,TypeNil.NIL);
+ TypeMem m2 = TypeMem.make(3,TypeInteger.U16);
+ TypeMem m3 = TypeMem.make(4,TypeFloat.F64);
+ TypeMem m4 = TypeMem.make(5,TypeInteger.BOT);
Assert.assertNotEquals(m1, m2);
Assert.assertNotEquals(m2, m3);
@@ -35,11 +37,11 @@ public class TypeTest {
Assert.assertEquals(TypeStruct.BOT, s1.meet(s2));
Assert.assertEquals(TypeMem .BOT, m1.meet(m2));
- Assert.assertEquals(TypeMem.make(0,Type.BOTTOM), m1.meet(m3));
+ Assert.assertEquals(TypeMem.make(1,Type.BOTTOM), m1.meet(m3));
Assert.assertEquals(TypeMem .BOT, m3.meet(m4));
- Assert.assertEquals(TypeMem.make(1,Type.BOTTOM), m1.glb(false));
- Assert.assertEquals(TypeMem.make(1,Type.XNIL), m1.dual());
+ Assert.assertEquals(TypeMem.make(2,Type.BOTTOM), m1.glb(false));
+ Assert.assertEquals(TypeMem.make(2,Type.XNIL), m1.dual());
Assert.assertEquals(m4.dual(), m4.glb(false).dual());
TypeMemPtr ptr1 = TypeMemPtr.make(s1);
@@ -55,13 +57,15 @@ public class TypeTest {
Assert.assertEquals(s2, ptr2nil._obj);
Assert.assertNotEquals(ptr1, ptr2);
- Assert.assertNotEquals(ptr1, ptr1.glb(false));
- Assert.assertEquals(ptr1nil.makeRO(), ptr1.glb(false));
+ Type p1glb = ptr1.glb(false);
+ Assert.assertNotEquals(ptr1, p1glb );
+ Type p1nro = ptr1nil.makeRO();
+ Assert.assertEquals(p1nro, p1glb);
Assert.assertEquals(ptr1, ptr1.dual().dual());
- Assert.assertEquals(ptr1.glb(false).makeRO(), ptr1.dual().glb(false));
+ Assert.assertTrue(p1glb.makeRO().isa( ptr1.dual().glb(false)));
Assert.assertEquals(TypeMemPtr.makeNullable(TypeStruct.BOT), ptr1.meet(ptr2nil));
- Assert.assertEquals(ptr1.glb(false), ptr1.meet(TypeNil.NIL).makeRO());
+ Assert.assertEquals(p1glb, ptr1.meet(TypeNil.NIL).makeRO());
TypeMemPtr TOP = TypeMemPtr.TOP;
TypeMemPtr BOT = TypeMemPtr.makeNullable(TypeStruct.BOT);
@@ -77,6 +81,19 @@ public class TypeTest {
Assert.assertEquals(TypePtr.XNPTR, NULL_join_PTR);
Type ptr1_dual = ptr1.dual();
Type nullableptr1_dual = ptr1nil.dual();
+
+ // Cyclic check
+ TypeStruct S1 = ((TypeMemPtr)TypeStruct.SFLT2.field("s1")._t)._obj;
+ Assert.assertFalse(s1.isFinal());
+ Type s1ro = S1.makeRO();
+ Type s1ro2 = S1.makeRO();
+ Assert.assertSame(s1ro,s1ro2);
+ Assert.assertTrue(s1ro.isFinal());
+
+ Assert.assertFalse(S1.isConstant());
+ Type s1glb = S1.field("s2")._t.glb(false);
+ Type s1glb2 = S1.field("s2")._t.glb(false);
+ Assert.assertSame(s1glb,s1glb2);
}
// Test theoretical properties.
@@ -150,9 +167,32 @@ public class TypeTest {
// Test cyclic types and meets
@Test
public void testCyclic0() {
- Type d0 = TypeStruct.S1.dual();
+ Type d0 = TypeStruct.SFLT2.dual();
Type d1 = d0.dual();
- assertSame(TypeStruct.S1,d1);
+ assertSame(TypeStruct.SFLT2,d1);
}
+ @Test
+ public void testGLB() {
+ Type[] ts = Type.gather();
+ for( Type t0 : ts )
+ if( !(t0 instanceof Field || t0 instanceof TypeStruct || t0 instanceof TypeTuple || t0 instanceof TypeConAry ) )
+ Assert.assertTrue(t0.isa(t0.glb(false)));
+ }
+
+ @Test
+ public void testList() {
+ TypeStruct list = TypeStruct.open("List");
+ TypeMemPtr plist = TypeMemPtr.makeNullable(list);
+ list = list.add(Field.make("next", plist, 2, false, false ) );
+ list = list.add(Field.make("x", TypeInteger.BOT, 3, false, false));
+ // Make a cyclic type
+ list = list.close();
+ // Fields are mutable
+ Assert.assertFalse(list.isFinal());
+ TypeStruct flist = (TypeStruct)list.makeRO();
+ Assert.assertTrue(flist.isFinal());
+ Assert.assertNotSame( list, flist );
+
+ }
}
diff --git a/src/test/java/com/seaofnodes/simple/evaluator/Evaluator.java b/src/test/java/com/seaofnodes/simple/evaluator/Evaluator.java
index a3b87e90..911acc5c 100644
--- a/src/test/java/com/seaofnodes/simple/evaluator/Evaluator.java
+++ b/src/test/java/com/seaofnodes/simple/evaluator/Evaluator.java
@@ -1,9 +1,8 @@
package com.seaofnodes.simple.evaluator;
-import com.seaofnodes.simple.Utils;
import com.seaofnodes.simple.node.*;
import com.seaofnodes.simple.type.*;
-
+import com.seaofnodes.simple.util.Utils;
import java.util.*;
public class Evaluator {
@@ -190,7 +189,7 @@ public class Evaluator {
if( n < 0 )
throw new NegativeArraySizeException(""+n);
body = new Object[(int)n+1]; // Array body
- var elem = type._fields[1]._type;
+ var elem = type._fields[1]._t;
if (elem instanceof TypeInteger) {
for (int i=0; i<n; i++) body[i+1] = 0L;
} else if (elem instanceof TypeFloat) {
@@ -203,7 +202,7 @@ public class Evaluator {
} else {
body = new Object[num = type._fields.length];
for( int i=0; i<num; i++ )
- body[i] = switch( alloc._ptr._obj._fields[i]._type ) {
+ body[i] = switch( alloc._ptr._obj._fields[i]._t ) {
case TypeInteger ti -> 0L;
case TypeFloat tf -> 0;
default -> null;
diff --git a/src/test/java/com/seaofnodes/simple/evaluator/Scheduler.java b/src/test/java/com/seaofnodes/simple/evaluator/Scheduler.java
index 7ba9272f..fee0f2a8 100644
--- a/src/test/java/com/seaofnodes/simple/evaluator/Scheduler.java
+++ b/src/test/java/com/seaofnodes/simple/evaluator/Scheduler.java
@@ -1,9 +1,8 @@
package com.seaofnodes.simple.evaluator;
-import com.seaofnodes.simple.Utils;
import com.seaofnodes.simple.node.*;
import com.seaofnodes.simple.type.Type;
-
+import com.seaofnodes.simple.util.Utils;
import java.util.*;
/**
diff --git a/src/test/java/com/seaofnodes/simple/fuzzer/Fuzzer.java b/src/test/java/com/seaofnodes/simple/fuzzer/Fuzzer.java
index 30a548ad..77e61b42 100644
--- a/src/test/java/com/seaofnodes/simple/fuzzer/Fuzzer.java
+++ b/src/test/java/com/seaofnodes/simple/fuzzer/Fuzzer.java
@@ -22,7 +22,7 @@ import java.util.function.Consumer;
*/
public class Fuzzer {
- private static final int EVAL_TIMEOUT = 1000;
+ private static final int EVAL_TIMEOUT = 10000;
/**
* List of exceptions already encountered.
@@ -82,10 +82,10 @@ public class Fuzzer {
private static void runCheck(String script, boolean valid) {
CodeGen code1;
try {
- code1 = FuzzerUtils.parse(script, 123);
+ code1 = FuzzerUtils.parse(script, 123, true);
} catch (RuntimeException e1) {
try {
- FuzzerUtils.parse(script, 456);
+ FuzzerUtils.parse(script, 456, false);
} catch (RuntimeException e2) {
if (FuzzerUtils.isExceptionFromSameCause(e1, e2)) {
if (!valid || e1.getClass() == Parser.ParseException.class) return;
@@ -95,7 +95,7 @@ public class Fuzzer {
}
throw e1;
}
- CodeGen code2 = FuzzerUtils.parse(script, 456);
+ CodeGen code2 = FuzzerUtils.parse(script, 456, false);
checkGraphs(code1, code2, 0);
checkGraphs(code1, code2, 1);
checkGraphs(code1, code2, 10);
diff --git a/src/test/java/com/seaofnodes/simple/fuzzer/FuzzerUtils.java b/src/test/java/com/seaofnodes/simple/fuzzer/FuzzerUtils.java
index b90b663d..e08b73fc 100644
--- a/src/test/java/com/seaofnodes/simple/fuzzer/FuzzerUtils.java
+++ b/src/test/java/com/seaofnodes/simple/fuzzer/FuzzerUtils.java
@@ -94,13 +94,13 @@ class FuzzerUtils {
/**
* Parse script with peepholes enabled or disabled
*/
- public static CodeGen parse(String script, long workListSeed) {
+ public static CodeGen parse(String script, long workListSeed, boolean reset) {
var err = System.err;
var out = System.out;
try {
System.setErr(NULL_PRINT_STREAM);
System.setOut(NULL_PRINT_STREAM);
- var code = new CodeGen(script, TypeInteger.BOT, workListSeed);
+ var code = new CodeGen(script, TypeInteger.BOT, workListSeed, reset);
return code.driver(CodeGen.Phase.LocalSched);
} finally {
System.setErr(err);
diff --git a/src/test/java/com/seaofnodes/simple/fuzzer/Reducer.java b/src/test/java/com/seaofnodes/simple/fuzzer/Reducer.java
index 3731b40c..856e6a24 100644
--- a/src/test/java/com/seaofnodes/simple/fuzzer/Reducer.java
+++ b/src/test/java/com/seaofnodes/simple/fuzzer/Reducer.java
@@ -41,14 +41,15 @@ public class Reducer {
new Replace(Pattern.compile("(?<=\\n|^)[^\\n]+(?=\\n|$)"), true, ""),
new Replace(Pattern.compile("(?<=[+\\-*/<>=(])--"), ""),
new Replace(Pattern.compile("\\b--"), "+"),
- new Replace(Pattern.compile("-"), ""),
+ new Replace(Pattern.compile("[-!]"), ""),
new Replace(Pattern.compile("\\b\\+-"), "-"),
- new Replace(Pattern.compile("(?<![+\\-*/<>=])(?:-|\\*|/|>=|<=|>|<|!=|==)(?![+\\-*/<>=])"), "+"),
+ new Replace(Pattern.compile("(?<![+\\-*/<>=&|])(?:-|\\*|/|>=|<=|>>>|>>|>|<<|<|!=|==|&&|\\|\\||&|\\||^)(?![+*/<>=&|])"), "+"),
+ new Replace(Pattern.compile("\\?([^;]+):"), "+"),
new Replace(Pattern.compile("\\{((?:[^{}]|\\{})+)(?:\\n[ \\t]*)?}"), "", "{}", 1),
new Replace(Pattern.compile("(?<=\\n|^)([ \\t]*)\\{\\n(.*?)\\n\\1}", Pattern.DOTALL), 2),
new Replace(Pattern.compile("\\(([^()]+)\\)"), 1),
- new Replace(Pattern.compile("\\d+\\+"), ""),
- new Replace(Pattern.compile("\\+\\d+"), ""),
+ new Replace(Pattern.compile("\\d+ ?\\+ ?"), ""),
+ new Replace(Pattern.compile(" ?\\+ ?\\d+"), ""),
new Replace(Pattern.compile("\\n\\n+"), "\n"),
new Replace(Pattern.compile("^\\n+|\\n+$"), ""),
new Replace(Pattern.compile("else *"), ""),
@@ -105,7 +106,7 @@ public class Reducer {
* Clean up variable names from the random ones generated by the fuzzer.
*/
private String cleanVariables(String script) {
- var matcher = Pattern.compile("\\b([0-9a-zA-Z_]+) ([0-9a-zA-Z_]+)").matcher(script);
+ var matcher = Pattern.compile("\\b([0-9a-zA-Z_]+) !?([0-9a-zA-Z_]+)").matcher(script);
int[] num = {0, 0};
while (matcher.find()) {
var type = matcher.group(1);
diff --git a/src/test/java/com/seaofnodes/simple/fuzzer/ScriptGenerator.java b/src/test/java/com/seaofnodes/simple/fuzzer/ScriptGenerator.java
index 4f86d0be..7d9e6483 100644
--- a/src/test/java/com/seaofnodes/simple/fuzzer/ScriptGenerator.java
+++ b/src/test/java/com/seaofnodes/simple/fuzzer/ScriptGenerator.java
@@ -20,12 +20,9 @@ import static com.seaofnodes.simple.Parser.KEYWORDS;
public class ScriptGenerator {
private static final int MAX_STATEMENTS_PER_BLOCK = 5;
- private static final int MAX_BINARY_EXPRESSIONS_PER_EXPRESSION = 10;
- private static final int MAX_UNARY_EXPRESSIONS_PER_EXPRESSION = 6;
private static final int MAX_NAME_LENGTH = 10;
private static final int MAX_BLOCK_DEPTH = 4;
private static final int MAX_EXPRESSION_DEPTH = 10;
- private static final int MAX_SUFFIX_RECURSIVE_DEPTH = 10;
/**
* Number of spaces per indentation
@@ -44,14 +41,6 @@ public class ScriptGenerator {
* Flag for a statement that it contains a final if statement without an else branch.
*/
private static final int FLAG_IF_WITHOUT_ELSE = 0x02;
- /**
- * Binary operators.
- */
- private static final String[] BINARY_OP = {"==", "!=", "<", "<=", ">", ">=", "+", "-", "*", "/", "&", ">>", ">>>", "<<"};
- /**
- * Unary operators.
- */
- private static final String[] UNARY_OP = {"-"};
private static class Type {
final String name;
@@ -147,10 +136,6 @@ public class ScriptGenerator {
*/
private int depth = MAX_BLOCK_DEPTH;
/**
- * The depth of expressions allowed.
- */
- private int exprDepth = MAX_EXPRESSION_DEPTH;
- /**
* Current variables in scope.
*/
private final ArrayList<Variable> variables = new ArrayList<>();
@@ -568,7 +553,7 @@ public class ScriptGenerator {
*/
public int genIf() {
sb.append("if(");
- genExpression(TYPE_BOOL, true);
+ genExpression(TYPE_BOOL, true, true);
sb.append(") ");
var stop = genStatementBlock();
if ((stop & FLAG_IF_WITHOUT_ELSE) == 0 && random.nextInt(10) > 3) {
@@ -614,7 +599,7 @@ public class ScriptGenerator {
*/
public int genWhile() {
sb.append("while(");
- genExpression(TYPE_BOOL, true);
+ genExpression(TYPE_BOOL, true, true);
sb.append(") ");
loopDepth++;
genStatementBlock();
@@ -640,17 +625,17 @@ public class ScriptGenerator {
indentation += INDENTATION;
String name = getVarName();
printIndentation().append("int ").append(name).append("=");
- genExpression(TYPE_INT, true);
+ genExpression(TYPE_INT, true, false);
sb.append(";\n");
addVariable(name, TYPE_INT);
printIndentation().append("while(").append(name).append("<");
- genExpression(TYPE_INT, true);
+ genShift(TYPE_INT, true, false, MAX_EXPRESSION_DEPTH);
sb.append(") {\n");
indentation += INDENTATION;
depth--;
loopDepth++;
printIndentation().append(name).append("=").append(name).append("+");
- genExpression(TYPE_INT, true);
+ genExpression(TYPE_INT, true, false);
sb.append(";\n");
genStatements();
loopDepth--;
@@ -675,7 +660,7 @@ public class ScriptGenerator {
sb.append(generateInvalid() ? getRandomName() : type.name).append(" !").append(name);
if (!(type instanceof TypeNullable) || random.nextBoolean()) {
sb.append("=");
- genExpression(type, true);
+ genExpression(type, true, type==TYPE_BOOL);
}
sb.append(";");
addVariable(name, type);
@@ -710,7 +695,7 @@ public class ScriptGenerator {
declared = field.type;
}
sb.append("=");
- genExpression(declared, true);
+ genExpression(declared, true, declared==TYPE_BOOL);
sb.append(";");
return 0;
}
@@ -722,43 +707,127 @@ public class ScriptGenerator {
public int genReturn() {
var type = getType();
sb.append("return ");
- genExpression(type, true);
+ genExpression(type, true, false);
sb.append(";");
return FLAG_STOP;
}
- /**
- * Generate a binary expression.
- * This method does not care about operator precedence.
- */
- public void genExpression(Type type, boolean change) {
+ public void genExpression(Type type, boolean change, boolean preferLogical) {
+ genExpression(type, change, preferLogical, MAX_EXPRESSION_DEPTH);
+ }
+
+ public void genExpression(Type type, boolean change, boolean preferLogical, int d) {
if (change && generateInvalid()) type = getType();
- if (!(type instanceof TypeInt) && type != TYPE_FLT) {
- genUnary(type, false);
- return;
+ if (d > 0 && random.nextInt(10)==0) {
+ genLogical(TYPE_INT, true, true, d);
+ sb.append("?");
+ genExpression(type, true, preferLogical, d-1);
+ sb.append(":");
+ genExpression(type, false, preferLogical, d-1);
+ } else {
+ genLogical(type, false, preferLogical, d);
+ }
+ }
+
+ public void genLogical(Type type, boolean change, boolean preferLogical, int d) {
+ if (change && generateInvalid()) type = getType();
+ genBitwise(type, false, preferLogical, d);
+ while (d-->0 && random.nextInt(preferLogical?5:50) == 0) {
+ sb.append(random.nextBoolean()?"&&":"||");
+ genBitwise(type, true, preferLogical, d);
+ }
+ }
+
+ public void genBitwise(Type type, boolean change, boolean preferLogical, int d) {
+ if (change && generateInvalid()) type = getType();
+ genComparison(type, false, preferLogical, d);
+ while (type instanceof TypeInt && d-->0 && random.nextInt(preferLogical?50:5)==0) {
+ sb.append("&|^".charAt(random.nextInt(3)));
+ genComparison(type, true, preferLogical, d);
+ }
+ }
+
+ public void genComparison(Type type, boolean change, boolean preferLogical, int d) {
+ if (change && generateInvalid()) type = getType();
+ if (d > 0 && type instanceof TypeInt && random.nextInt(preferLogical?5:50)==0) {
+ type = getType();
+ genComparison(type, true, preferLogical, d-1);
+ sb.append(random.nextBoolean()?"==":"!=");
+ }
+ genChaining(type, false, preferLogical, d);
+ }
+
+ public void genChaining(Type type, boolean change, boolean preferLogical, int d) {
+ if (change && generateInvalid()) type = getType();
+ if (d>0 && type instanceof TypeInt && random.nextInt(preferLogical?5:50)==0) {
+ genShift(TYPE_INT, true, false, d);
+ char c = random.nextBoolean()?'>':'<';
+ sb.append(c);
+ if (random.nextInt(4)==0) sb.append('=');
+ genShift(TYPE_INT, true, false, --d);
+ while (d-->0 && random.nextInt(preferLogical?5:50)==0) {
+ if (generateInvalid()) c = c=='>' ? '<' : '>';
+ sb.append(c);
+ if (random.nextInt(4)==0) sb.append('=');
+ genShift(TYPE_INT, true, false, d);
+ }
+ } else {
+ genShift(type, false, preferLogical, d);
}
- var num = randLog(MAX_BINARY_EXPRESSIONS_PER_EXPRESSION);
- while(num-->0) {
- genUnary(type, false);
- sb.append(BINARY_OP[random.nextInt(BINARY_OP.length)]);
+ }
+
+ private static final String[] SHIFTS = {">>", ">>>", "<<"};
+
+ public void genShift(Type type, boolean change, boolean preferLogical, int d) {
+ if (change && generateInvalid()) type = getType();
+ genAddition(type, false, preferLogical, d);
+ while (d-- > 0 && type instanceof TypeInt && random.nextInt(50)==0) {
+ sb.append(SHIFTS[random.nextInt(3)]);
+ genAddition(type, true, preferLogical, d);
+ }
+ }
+
+ public void genAddition(Type type, boolean change, boolean preferLogical, int d) {
+ if (change && generateInvalid()) type = getType();
+ genMultiplication(type, false, preferLogical, d);
+ while (d-- > 0 && (type instanceof TypeInt || type==TYPE_FLT) && random.nextInt(50)==0) {
+ sb.append(random.nextBoolean()?" + ":" - ");
+ genMultiplication(type, true, preferLogical, d);
+ }
+ }
+
+ public void genMultiplication(Type type, boolean change, boolean preferLogical, int d) {
+ if (change && generateInvalid()) type = getType();
+ genUnary(type, false, preferLogical, d);
+ while (d-- > 0 && (type instanceof TypeInt || type==TYPE_FLT) && random.nextInt(50)==0) {
+ sb.append(random.nextBoolean()?'*':'/');
+ genUnary(type, true, preferLogical, d);
}
- genUnary(type, false);
}
/**
* Generate a unary expression.
*/
- public void genUnary(Type type, boolean change) {
+ public void genUnary(Type type, boolean change, boolean preferLogical, int d) {
if (change && generateInvalid()) type = getType();
if (!(type instanceof TypeInt) && type != TYPE_FLT) {
- genSuffix(type, false);
+ genSuffix(type, false, preferLogical, d);
return;
}
- var num = randLog(MAX_UNARY_EXPRESSIONS_PER_EXPRESSION);
- while(num-->0) {
- sb.append(UNARY_OP[random.nextInt(UNARY_OP.length)]);
+ while (d>0 && random.nextInt(5)==0) {
+ d--;
+ boolean what = type instanceof TypeInt && random.nextInt(preferLogical?2:20) == 0;
+ sb.append(what?'!':'-');
+ }
+ if (random.nextInt(10)==0) {
+ var t = type;
+ var v = findVisibleVariablesMatching(va->va.type.isa(t));
+ if (v != null) {
+ sb.append(random.nextBoolean()?"--":"++").append(v.name);
+ return;
+ }
}
- genSuffix(type, false);
+ genSuffix(type, false, preferLogical, d);
}
public TypeStruct.Field getField(Type type) {
@@ -778,45 +847,45 @@ public class ScriptGenerator {
throw new AssertionError();
}
- /**
- * Generate
- */
- public void genSuffix(Type type, boolean change) {
- genSuffixRecursive(type, change, MAX_SUFFIX_RECURSIVE_DEPTH);
- }
-
- public void genSuffixRecursive(Type type, boolean change, int depth) {
+ public void genSuffix(Type type, boolean change, boolean preferLogical, int d) {
if (change && generateInvalid()) type = getType();
- if (depth > 0 && random.nextBoolean()) {
- if (generateInvalid()) {
- var field = getRandomName();
- var t = getType();
- genSuffixRecursive(t, true, depth-1);
- sb.append(".").append(field);
+ if (d > 0 && random.nextBoolean() && genField(type, d-1)) return;
+ if (d > 0 && random.nextInt(10) == 0) {
+ if (random.nextBoolean() && genField(type, d-1)) return;
+ var t = type;
+ var v = findVisibleVariablesMatching(va -> va.type.isa(t));
+ if (v != null) {
+ sb.append(v.name).append(random.nextBoolean() ? "--" : "++");
return;
- } else {
- var field = getField(type);
- if (field != null) {
- genSuffixRecursive(field.struct, true, depth-1);
- sb.append(".").append(field.name);
- return;
- }
}
}
- genPrimary(type, false);
+ genPrimary(type, false, preferLogical, d);
+ }
+
+ public boolean genField(Type type, int d) {
+ if (generateInvalid()) {
+ var field = getRandomName();
+ var t = getType();
+ genSuffix(t, true, false, d);
+ sb.append(".").append(field);
+ } else {
+ var field = getField(type);
+ if (field == null) return false;
+ genSuffix(field.struct, true, false, d);
+ sb.append(".").append(field.name);
+ }
+ return true;
}
/**
* Generate a primary expression.
*/
- public void genPrimary(Type type, boolean change) {
+ public void genPrimary(Type type, boolean change, boolean preferLogical, int d) {
if (change && generateInvalid()) type = getType();
var rand = random.nextInt(10);
- if (rand == 0 && exprDepth != 0) {
+ if (d > 0 && rand == 0) {
sb.append("(");
- exprDepth--;
- genExpression(type, false);
- exprDepth++;
+ genExpression(type, false, preferLogical, d-1);
sb.append(")");
} else if (rand < 6) {
genVariable(type);
diff --git a/src/test/java/com/seaofnodes/simple/progs/and1.smp b/src/test/java/com/seaofnodes/simple/progs/and1.smp
new file mode 100644
index 00000000..ef4c904f
--- /dev/null
+++ b/src/test/java/com/seaofnodes/simple/progs/and1.smp
@@ -0,0 +1,10 @@
+// -*- mode: java; -*-
+int a = 1;
+int b = 1;
+
+if(a && b) {
+ sys.io.p("And");
+} else {
+ sys.io.p("Or");
+}
+return 0;
diff --git a/src/test/java/com/seaofnodes/simple/progs/and2.smp b/src/test/java/com/seaofnodes/simple/progs/and2.smp
new file mode 100644
index 00000000..2a463c94
--- /dev/null
+++ b/src/test/java/com/seaofnodes/simple/progs/and2.smp
@@ -0,0 +1,16 @@
+// -*- mode: java; -*-
+int a = 1;
+int b = 1;
+
+int x=1;
+int y=1;
+int z=0;
+
+int g = x++ && y++ && z++;
+
+if(x == 2 && y == 2 && z == 1 && g == 0) {
+ sys.io.p("Effected");
+} else {
+ sys.io.p("Not effected");
+}
+return 0;
diff --git a/src/test/java/com/seaofnodes/simple/progs/and3.smp b/src/test/java/com/seaofnodes/simple/progs/and3.smp
new file mode 100644
index 00000000..aadbdfed
--- /dev/null
+++ b/src/test/java/com/seaofnodes/simple/progs/and3.smp
@@ -0,0 +1,14 @@
+// -*- mode: java; -*-
+int a = 1;
+int b = 1;
+
+var sq = { int x ->
+ x*x;
+};
+
+if(a && sq(0)) {
+ sys.io.p("And");
+} else {
+ sys.io.p("Or");
+}
+return 0;
diff --git a/src/test/java/com/seaofnodes/simple/progs/large.smp b/src/test/java/com/seaofnodes/simple/progs/large.smp
new file mode 100644
index 00000000..7f151f60
--- /dev/null
+++ b/src/test/java/com/seaofnodes/simple/progs/large.smp
@@ -0,0 +1,5344 @@
+
+struct stbi_io_callbacks {
+ { i64 u8[] int -> int } read = "C"; // fill 'data' with 'size' bytes. return number of bytes actually read
+ { i64 int -> int } skip = "C"; // skip the next 'n' bytes, or 'unget' the last -n bytes if negative
+ { i64 -> int } eof = "C"; // returns nonzero if we are at end of file/data
+};
+
+struct stbi__context {
+ u32 img_x, img_y;
+ int img_n, img_out_n;
+
+ stbi_io_callbacks io;
+ u8[]io_user_data;
+
+ int read_from_callbacks;
+ int buflen;
+ u8[] buffer_start;
+ int callback_already_read;
+
+ u8[] img_buffer;
+ int img_buffer_end;
+ u8[] img_buffer_original;
+ int img_buffer_original_end;
+};
+
+{ stbi__context -> u8 } stbi__get8 = "C";
+
+val sample = { stbi__context s, int pal_len ->
+ var palette = new u8[1024];
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+ for (int i=0; i < pal_len; ++i) {
+ palette[i*4+3] = 0;
+
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ for (int j=0; j < pal_len; ++j) {
+ palette[j*4+3] = 0;
+
+ palette[j*4+0] = stbi__get8(s);
+ palette[j*4+1] = stbi__get8(s);
+ palette[j*4+2] = stbi__get8(s);
+ palette[j*4+3] = 255;
+ }
+ }
+
+ return palette;
+};
diff --git a/src/test/java/com/seaofnodes/simple/progs/or1.smp b/src/test/java/com/seaofnodes/simple/progs/or1.smp
new file mode 100644
index 00000000..f5f526c3
--- /dev/null
+++ b/src/test/java/com/seaofnodes/simple/progs/or1.smp
@@ -0,0 +1,12 @@
+// -*- mode: java; -*-
+int a = 1;
+int b = 0;
+
+if(a++ || b++ ) {
+ if(b == 0 && a == 2) {
+ sys.io.p("Or");
+ }
+} else{
+ sys.io.p("And");
+}
+return 0;
diff --git a/src/test/java/com/seaofnodes/simple/progs/or2.smp b/src/test/java/com/seaofnodes/simple/progs/or2.smp
new file mode 100644
index 00000000..ac688b5a
--- /dev/null
+++ b/src/test/java/com/seaofnodes/simple/progs/or2.smp
@@ -0,0 +1,23 @@
+// -*- mode: java; -*-
+int a = 1;
+int b = 1;
+
+int x = -1;
+int y=1;
+int z= -1;
+
+int g = x++ || y++ || z++;
+
+int switch = 0;
+if(x == 4 || y == 4 || z == 4) {
+ switch = -1;
+} else {
+ switch = 1;
+}
+int cd = 1;
+if((x == 0 && y == 1 && z==-1) && switch && g) {
+ sys.io.p("Effected");
+} else {
+ sys.io.p("Not effected");
+}
+return 0;
diff --git a/src/test/java/com/seaofnodes/simple/progs/print.smp b/src/test/java/com/seaofnodes/simple/progs/print.smp
new file mode 100644
index 00000000..3bb86268
--- /dev/null
+++ b/src/test/java/com/seaofnodes/simple/progs/print.smp
@@ -0,0 +1,8 @@
+int x = 1;
+
+int y = 2;
+if(x == 1) {
+y = 1;
+}
+
+return y; \ No newline at end of file
diff --git a/src/test/java/com/seaofnodes/simple/progs/ptrand.smp b/src/test/java/com/seaofnodes/simple/progs/ptrand.smp
new file mode 100644
index 00000000..9d7bce88
--- /dev/null
+++ b/src/test/java/com/seaofnodes/simple/progs/ptrand.smp
@@ -0,0 +1,10 @@
+struct S { S? fld; };
+
+val ptr = arg == 1 ? null : new S{fld = arg==1 ? null : new S{fld = null;};};
+if( ptr && ptr.fld ) {
+ sys.io.p("true");
+} else {
+ sys.io.p("false");
+}
+
+return 0;
diff --git a/src/test/java/com/seaofnodes/simple/progs/stringHash.smp b/src/test/java/com/seaofnodes/simple/progs/stringHash.smp
index dafa7456..3fa2174c 100644
--- a/src/test/java/com/seaofnodes/simple/progs/stringHash.smp
+++ b/src/test/java/com/seaofnodes/simple/progs/stringHash.smp
@@ -23,9 +23,8 @@ val hashCode = { String self ->
val _hashCodeString = { String self ->
int hash=0;
- if( self.cs )
- for( int i=0; i< self.cs#; i++ )
- hash = hash*31 + self.cs[i];
+ for( int i=0; i< self.cs#; i++ )
+ hash = hash*31 + self.cs[i];
if( !hash ) hash = 123456789;
return hash;
};