/* EZGEM This program converts GEM files generated by UniTerm into the format wanted by EasyDraw. The changes include rescaling and joining vectors into polylines. Don Rice / FXDDR@ALASKA.bitnet / CIS 72337,3417 */ #include #include #define XSCALE 6 #define XOFFS 2730 #define YSCALE 5 #define YOFFS 3276 short inbuf[256], outbuf[256] = { #include }; short inptr, outptr; struct { short op, vert, parms, subop, x[128], y[128], p[128]; } incode; short newx[128], newy[128], nxy; short nvecs, nlines, nreads, nwrites; short startline[5] = { 5, 0, 1, 99, 80 }, polyfill[17] = { 5, 0, 2, 99, 155, 1, 5, 0, 2, 99, 157, 0, 23, 0, 1, 99, 0 }, polyline[4] = { 6, 2, 0, 99 }, endline[5] = { 5, 0, 1, 99, 81 }; main() { int old, new; short getmeta(), op; char fname[80]; printf( "Name of UniTerm GEM file: " ); gets( fname ); if( (old = open( fname, O_RDONLY | O_RAW )) == -1 ) terminate( "Unable to open input file." ); printf( "Name of new GEM file: " ); gets( fname ); if( (new = open( fname, O_WRONLY | O_CREAT | O_RAW )) == -1 ) terminate( "Unable to open output file." ); init_files( old, new ); while( (op = getmeta( old )) != 6 ) ; /* Skip old header */ wrvect( new ); while( (op = getmeta( old )) != 4 ) { if( op == -1 ) break; /* EOF */ if( op == 6 ) wrvect( new ); } close( old ); finish( new ); close( new ); printf( "\n%d vectors read; %d polylines written.\n", nvecs, nlines ); terminate( "File conversion completed." ); } /* main */ cpyvert( new ) /* Copy vertices to polyline list */ int new; { short i, j; j = (nxy ? nxy-1 : 0 ); for( i=0; i 127 ) { wrpoly( new ); newx[0] = newx[127]; newy[0] = newy[127]; j = 1; } newx[j] = incode.x[i]; newy[j++] = incode.y[i]; } nxy = j; } /* cpyvert */ finish( new ) /* Flush output buffer, write end of file */ int new; { if( nxy > 0 ) wrpoly( new ); wrshort( new, -1 ); wrshort( new, 0 ); wrshort( new, 0 ); wrshort( new, 0 ); if( outptr > 0 ) write( new, outbuf, 512 ); } /* finish */ short getmeta( old ) /* Read new metafile operation */ int old; { short i, getshort(); incode.op = getshort( old ); if( incode.op == -1 ) return( -1 ); incode.vert = getshort( old ); incode.parms = getshort( old ); incode.subop = getshort( old ); for( i=0; i>8)&0x0FF) | (inbuf[inptr]<<8); if( ++inptr >= 256 ) { l = read( old, inbuf, 512 ); printf( "%dK read, %dK written\r", (++nreads)/2, nwrites/2 ); while( l < 512 ) if( l >= 0 ) inbuf[l++] = -1; else l=0; inptr = 0; } return( x ); } /* getshort */ init_files( old, new ) /* Set up i/o buffers */ int old, new; { read( old, inbuf, 512 ); inptr = 16; outptr = 172; nxy = nwrites = nvecs = nlines = 0; nreads = 1; } /* init_files */ terminate( str ) char *str; { char ans[80]; puts( str ); printf( "Press RETURN to quit: " ); gets( ans ); exit(); } /* terminate */ wrpoly( new ) /* Write polyline to output */ int new; { short i; polyline[1] = nxy; for( i=0; i<5; i++ ) wrshort( new, startline[i] ); if( nxy > 2 ) /* true polyline */ for( i=0; i<17; i++ ) wrshort( new, polyfill[i] ); for( i=0; i<4; i++ ) wrshort( new, polyline[i] ); for( i=0; i>8)&0x0FF) | (i<<8); /* Swap byte order */ outbuf[outptr++] = i; if( outptr >= 256 ) { write( new, outbuf, 512 ); printf( "%dK read, %dK written\r", nreads/2, (++nwrites)/2 ); outptr = 0; } } /* wrshort */ wrvect( new ) /* Add vector to polyline buffer */ int new; { short i; for( i=0; i