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