summaryrefslogtreecommitdiff
path: root/sch.h
blob: b1e2d7058fe5cc9f462546c6cbc3a4678a403eba (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
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
/*
 * sch.h - Parse Eeschema .sch file
 *
 * Written 2016 by Werner Almesberger
 * Copyright 2016 by Werner Almesberger
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 */


#ifndef SCH_H
#define SCH_H

#include <stdbool.h>

#include "dwg.h"
#include "text.h"
#include "lib.h"


enum sch_state {
	sch_basic,	/* basic state */
	sch_descr,	/* prelude and description */
	sch_comp,	/* component */
	sch_sheet,	/* sub-sheet */
	sch_text,	/* text or label */
	sch_wire,	/* wire */
};

struct sch_obj {
	enum sch_obj_type {
		sch_obj_wire,
		sch_obj_junction,
		sch_obj_noconn,
		sch_obj_text,
		sch_obj_comp,
		sch_obj_sheet,
	} type;

	int x, y;

	union {
		struct sch_wire {
			void (*fn)(int sx, int sy, int ex, int ey);
			int ex, ey;
		} wire;
		struct sch_text {
			void (*fn)(int x, int y, const char *s,
			    int dir, int dim, enum dwg_shape shape);
			const char *s;
			int dir;	/* orientation */
			int dim;	/* dimension */
			enum dwg_shape shape;
		} text;
		struct sch_comp {
			const struct comp *comp; /* current component */
			unsigned unit;	/* unit of current component */
			struct comp_field {
				struct text txt;
				struct comp_field *next;
			} *fields;
			int m[6];
		} comp;
		struct sch_sheet {
			unsigned h, w;
			const char *sheet;
			unsigned sheet_dim;
			const char *file;
			unsigned file_dim;
			bool rotated;

			struct sheet_field {
				char *s;
				int x, y;
				unsigned dim;
				enum dwg_shape shape;
				unsigned side;
				struct sheet_field *next;
			} *fields;
		} sheet;
	} u;

	struct sch_obj *next;
};

struct sheet {
	struct sch_obj *objs;
	struct sheet *next;
};

struct sch_file {
	const char *name;
	int lineno;
	struct sch_file *parent;
};

struct sch_ctx {
	enum sch_state state;

	bool recurse;

	struct sch_obj obj;
	struct sch_obj **next_obj;

	struct sheet *sheets;
	struct sheet **next_sheet;

	const struct lib *lib;

	struct sch_file *file;
};


void decode_alignment(struct text *txt, char hor, char vert);

void sch_render(const struct sheet *sheet);
void sch_parse(struct sch_ctx *ctx, const char *file, const struct lib *lib);
void sch_init(struct sch_ctx *ctx, bool recurse);

#endif /* !SCH_H */