summaryrefslogtreecommitdiff
path: root/src/mesa/shader/slang/library/gc_to_bin.c
blob: 749c57a032f155c06f7f6b66d6e5574a19974292 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
#include "../../grammar/grammar_crt.h"
#include "../../grammar/grammar_crt.c"
#include <stdio.h>

static const char *slang_shader_syn =
#include "slang_shader_syn.h"
;

static void gc_to_bin (grammar id, const char *in, const char *out)
{
	FILE *f;
	byte *source, *prod;
	unsigned int size, i, line = 0;

	printf ("Precompiling %s\n", in);

	f = fopen (in, "r");
	if (f == NULL)
		return;
	fseek (f, 0, SEEK_END);
	size = ftell (f);
	fseek (f, 0, SEEK_SET);
	source = (byte *) grammar_alloc_malloc (size + 1);
	source[fread (source, 1, size, f)] = '\0';
	fclose (f);

	if (!grammar_fast_check (id, source, &prod, &size, 65536))
	{
		grammar_alloc_free (source);
		return;
	}

	f = fopen (out, "w");
	fprintf (f, "\n");
	fprintf (f, "/* DO NOT EDIT - THIS FILE AUTOMATICALLY GENERATED FROM THE FOLLOWING FILE: */\n");
	fprintf (f, "/* %s */\n", in);
	fprintf (f, "\n");
	for (i = 0; i < size; i++)
	{
		unsigned int a;
		if (prod[i] < 10)
			a = 1;
		else if (prod[i] < 100)
			a = 2;
		else
			a = 3;
		if (i < size - 1)
			a++;
		if (line + a >= 100)
		{
			fprintf (f, "\n");
			line = 0;
		}
		line += a;
		fprintf (f, "%d", prod[i]);
		if (i < size - 1)
			fprintf (f, ",");
	}
	fprintf (f, "\n");
	fclose (f);
	grammar_alloc_free (prod);
}

int main ()
{
	grammar id;

	id = grammar_load_from_text ((const byte *) slang_shader_syn);
	if (id == 0)
		return 1;

	grammar_set_reg8 (id, (const byte *) "parsing_builtin", 1);

	grammar_set_reg8 (id, (const byte *) "shader_type", 1);
	gc_to_bin (id, "slang_core.gc", "slang_core_gc.h");
	gc_to_bin (id, "slang_common_builtin.gc", "slang_common_builtin_gc.h");
	gc_to_bin (id, "slang_fragment_builtin.gc", "slang_fragment_builtin_gc.h");

	grammar_set_reg8 (id, (const byte *) "shader_type", 2);
	gc_to_bin (id, "slang_vertex_builtin.gc", "slang_vertex_builtin_gc.h");

	grammar_destroy (id);

	return 0;
}