pa1132@sdcc15.ucsd.edu (pa1132) (04/04/89)
Has anyone complied the routines from the file vdit from the comp.sources.atari.st archive at ssyx.ucsc.edu? I try to complie the file vdi.c with Laser C ver 1.01 and get error messages unidentified variable: i expression error; and a number of other error messages at the function vdi_int1(h,op,i) (see the source code below) I cannot find out what is wrong with the function. I try to complie the same source file with the Unix C complier (cc) and it does not find any errors and successfully produced a vdi.o object file. Why does Laser C refuse to complie this file? Do I find a bug in Laser C ver 1.01 (the 3/88 release)? If this is a bug, is it corrected in Laser C Ver 2.0? Any info is appreciated. The complete source of vdi.c follows. The gfont.h and vdi.h header files can be obtained by getting the vdit file from ssyx.ucsc.edu - -------------------------- vdi.c --------------------- /* * PD mini VDI interface, Eric Gisin */ #include "osbind.h" #include "vdi.h" #include "gfont.h" #define NULL 0L static short ct [12]; /* VDI/AES control block */ static short ii [140]; static short pi [16]; static short io [47]; static short po [16]; struct Params v_ps = {ct, ii, pi, io, po, NULL}; struct Params v_pt = {ct, ii, pi, io, po, NULL}; /* modifiable version of v_ps */ /* VDI operations with no parameters */ vdi_none(h, op) short h, op; { vdi_setup(op, h, 0, 0); vdi(&v_ps); } /* VDI operations with one integer parameter */ vdi_int1(h, op, i) /*-----------------------------------------*/ /*here is what cause the error messages */ /*-------------------------------------------------*/ short h, op; short i; { ii[0] = i; vdi_setup(op, h, 1, 0); vdi(&v_ps); return io[0]; } /* VDI operations with one point parameter */ vdi_pnt1(h, op, x, y) short h, op; short x, y; { pi[0] = x, pi[1] = y; vdi_setup(op, h, 0, 1); vdi(&v_ps); } vdi_pnt4v(h, op, fn, pnt) short h; short op, fn; short *pnt; { register int i; for (i = 0; i < 4; i++) pi[i] = pnt[i]; vdi_setup(op, h, 0, 2); ct[5] = fn; vdi(&v_ps); } /* open virtual work */ v_opnvwk(in, hp, out) /* todo: vdi_open */ short in[]; short *hp; short out[]; { v_pt.ii = in; v_pt.io = out; v_pt.pi = pi; v_pt.po = out+34; vdi_setup(100, *hp, 11, 0); vdi(&v_pt); *hp = ct[6]; } vdi_cpyfm(h, op, mode, sdr, src, dst) short h, op; short mode; short *sdr; /* source/dest rectangles */ Form *src, *dst; /* source/dest forms */ { register int i; *((Form**)&ct[7]) = src; *((Form**)&ct[9]) = dst; ii[0] = mode; for (i = 0; i < 8; i++) pi[i] = sdr[i]; /*** *((Rect*)&pi[0]) = sdr[0]; *((Rect*)&pi[4]) = sdr[1]; ***/ vdi_setup(op, h, 1, 4); vdi(&v_ps); } vst_alignment(h, x, y, xp, yp) short h; short x, y; short *xp, *yp; { ii[0] = x, ii[1] = y; vdi_setup(39, h, 2, 0); vdi(&v_ps); *xp = io[0], *yp = io[1]; } v_gtext(h, x, y, s) short h; short x, y; unsigned char *s; { register int i; for (i = 0; *s != 0 && i < 140; i++) ii[i] = *s++; pi[0] = x; pi[1] = y; vdi_setup(8, h, i, 1); vdi(&v_ps); } vqt_attributes(h, at) short *at; /*struct vdi_tattr *at;*/ { v_pt.io = at; v_pt.po = at+6; vdi_setup(38, h, 0, 0); vdi(&v_pt); } static char *vdi_scratch = NULL; /* VDI/LineA scratch buffer */ #if 0 /* load GDOS fonts using user's vx_load_fonts */ vst_load_fonts(h, select) short h, select; { GFont * fp; extern char * malloc(); extern GFont * vx_load_fonts(); /* user routine to load fonts */ if (vdi_scratch == NULL) vdi_scratch = malloc(1024); /* scratch buffer */ *((char **)&ct[7]) = vdi_scratch; ct[9] = 256; /* offset of enlargment buffer */ *((char **)&ct[10]) = fp = vx_load_fonts(select); /* GDOS font list */ if (fp == 0) return 0; vdi_setup(119, h, 0, 0); vdi(&v_ps); return io[0]; /* number of fonts loaded */ } vst_unload_fonts(h) { extern void vx_unload_fonts(); vdi_setup(120, h, 0, 0); vdi(&v_ps); vx_unload_fonts(); } #endif /* load GDOS fonts using fp */ /* make sure your ct array is large enough if you port this */ vstx_load_fonts(h, fp) short h; GFont *fp; { extern char * malloc(); if (vdi_scratch == NULL) vdi_scratch = malloc(1024); /* scratch buffer */ *((char **)&ct[7]) = vdi_scratch; ct[9] = 256; /* offset of enlargment buffer */ *((char **)&ct[10]) = fp; if (fp == NULL) return 0; vdi_setup(119, h, 0, 0); vdi(&v_ps); return io[0]; /* number of fonts loaded */ } vstx_unload_fonts(h) { vdi_setup(120, h, 0, 0); vdi(&v_ps); } #if 0 /* * This code invokes VDI ESC 102 code (page 440 in the July '86 * Abacus ST Internals BIOS listing). I decompiled some library * routines to see how to make it work. It may not work on new ROMS. * Martin Minow, Arlington MA 02174. This routine is in the public domain. */ vt_set_font(fp) register GFont * fp; { (*(GFont**)&ii[0]) = fp; /* Put font info in intin[0] */ vdi_setup(5, 0, 2, 0); ct[5] = 102; vdi(&v_ps); } #endif