Annotation of OpenXM/src/ox_toolkit/ox_Xsample.c, Revision 1.3
1.1 ohara 1: /* -*- mode: C; coding: euc-japan -*- */
1.3 ! ohara 2: /* $OpenXM: OpenXM/src/ox_toolkit/ox_Xsample.c,v 1.2 2000/03/10 12:24:38 ohara Exp $ */
1.1 ohara 3:
4: #include <stdio.h>
1.2 ohara 5: #include "ox_toolkit.h"
1.1 ohara 6:
1.3 ! ohara 7: OXFILE *fd_rw;
1.1 ohara 8:
9: #define INIT_S_SIZE 2048
10: #define EXT_S_SIZE 2048
11:
12: static int stack_size = 0;
13: static int stack_pointer = 0;
14: static cmo **stack = NULL;
15:
16: int initialize_stack()
17: {
18: stack_pointer = 0;
1.3 ! ohara 19: stack_size = INIT_S_SIZE;
! 20: stack = malloc(stack_size*sizeof(cmo*));
1.1 ohara 21: }
22:
23: static int extend_stack()
24: {
1.3 ! ohara 25: int size2 = stack_size + EXT_S_SIZE;
! 26: cmo **stack2 = malloc(size2*sizeof(cmo*));
! 27: memcpy(stack2, stack, stack_size*sizeof(cmo *));
! 28: free(stack);
! 29: stack = stack2;
! 30: stack_size = size2;
1.1 ohara 31: }
32:
33: int push(cmo* m)
34: {
35: stack[stack_pointer] = m;
36: stack_pointer++;
37: if (stack_pointer >= stack_size) {
1.3 ! ohara 38: extend_stack();
1.1 ohara 39: }
40: }
41:
42: cmo* pop()
43: {
44: if (stack_pointer > 0) {
45: stack_pointer--;
46: return stack[stack_pointer];
47: }
48: return new_cmo_null();
49: }
50:
51: void pops(int n)
52: {
53: stack_pointer -= n;
54: if (stack_pointer < 0) {
55: stack_pointer = 0;
56: }
57: }
58:
59: #define VERSION 0x11121400
1.3 ! ohara 60: #define ID_STRING "1999/12/14 15:25:00"
1.1 ohara 61:
62: int sm_mathcap()
63: {
1.3 ! ohara 64: mathcap_sysinfo_set(VERSION, ID_STRING, "ox_Xsample");
! 65: push(mathcap_get());
1.1 ohara 66: return 0;
67: }
68:
69: int sm_popCMO()
70: {
71: cmo* m = pop();
72:
73: if (m != NULL) {
74: send_ox_cmo(fd_rw, m);
75: return 0;
76: }
77: return SM_popCMO;
78: }
79:
80: cmo_error2 *make_error2(int code)
81: {
1.3 ! ohara 82: return new_cmo_int32(-1);
1.1 ohara 83: }
84:
85: int get_i()
86: {
1.3 ! ohara 87: cmo *c = pop();
! 88: if (c->tag == CMO_INT32) {
! 89: return ((cmo_int32 *)c)->i;
! 90: }else if (c->tag == CMO_ZZ) {
! 91: return mpz_get_si(((cmo_zz *)c)->mpz);
! 92: }
! 93: make_error2(-1);
! 94: return 0;
1.1 ohara 95: }
96:
97: int get_xy(int *x, int *y)
98: {
1.3 ! ohara 99: cmo *c = pop();
! 100: *x = get_i();
! 101: *y = get_i();
1.1 ohara 102: }
103:
104: int my_setpixel()
105: {
1.3 ! ohara 106: int x, y;
! 107: get_xy(&x, &y);
! 108: setpixel(x, y);
! 109: push(new_cmo_int32(0));
1.1 ohara 110: }
111:
112: int my_moveto()
113: {
1.3 ! ohara 114: int x, y;
! 115: get_xy(&x, &y);
! 116: moveto(x, y);
! 117: push(new_cmo_int32(0));
1.1 ohara 118: }
119:
120: int my_lineto()
121: {
1.3 ! ohara 122: int x, y;
! 123: get_xy(&x, &y);
! 124: lineto(x, y);
! 125: push(new_cmo_int32(0));
1.1 ohara 126: }
127:
128: int my_clear()
129: {
1.3 ! ohara 130: /* dummy */
! 131: pop();
! 132: push(new_cmo_int32(0));
1.1 ohara 133: }
134:
135: int sm_executeFunction()
136: {
1.3 ! ohara 137: cmo_string *func = (cmo_string *)pop();
! 138: if (func->tag != CMO_STRING) {
! 139: push(make_error2(0));
! 140: return -1;
! 141: }
! 142: if (strcmp(func->s, "setpixel") == 0) {
! 143: my_setpixel();
! 144: }else if (strcmp(func->s, "moveto") == 0) {
! 145: my_moveto();
! 146: }else if (strcmp(func->s, "lineto") == 0) {
! 147: my_lineto();
! 148: }else if (strcmp(func->s, "clear") == 0) {
! 149: my_clear();
! 150: }else {
! 151: push(make_error2(0));
! 152: return -1;
! 153: }
1.1 ohara 154: }
155:
156:
157: int receive_and_execute_sm_command()
158: {
159: int code = receive_int32(fd_rw);
160: switch(code) {
161: case SM_popCMO:
162: sm_popCMO();
163: break;
164: case SM_executeFunction:
165: sm_executeFunction();
166: break;
167: case SM_mathcap:
168: sm_mathcap();
169: break;
170: case SM_setMathCap:
171: pop();
172: break;
173: default:
174: }
175: }
176:
177: int receive()
178: {
179: int tag;
180:
181: tag = receive_ox_tag(fd_rw);
182: switch(tag) {
183: case OX_DATA:
184: push(receive_cmo(fd_rw));
185: break;
186: case OX_COMMAND:
187: receive_and_execute_sm_command();
188: break;
189: default:
190: }
191: return 0;
192: }
193:
194: int main()
195: {
196: initialize_stack();
197:
1.3 ! ohara 198: fd_rw = oxf_open(3);
! 199: oxf_determine_byteorder_server(fd_rw);
! 200:
! 201: gopen();
1.1 ohara 202: while(1) {
203: receive();
1.3 ! ohara 204: gFlush();
1.1 ohara 205: }
1.3 ! ohara 206: gclose();
1.1 ohara 207: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>