Mercurial > hg > forks > pwpunix
view pwplib/setup.c @ 71:a87eb778f225
Improvements to the MinGW crossbuild. Should now build with default tools
from Debian mingw packages, though you need Win32 version of libSDL with the
necessary headers and so on in addition. 64-bit builds not tested and
probably won't work. Tested on Debian 7.0, earlier won't work.
binutils-mingw-w64-i686 gcc-mingw-w64-i686 mingw-w64-i686-dev
author | Matti Hamalainen <ccr@tnsp.org> |
---|---|
date | Tue, 14 Aug 2012 03:08:10 +0300 |
parents | 25861c440f15 |
children |
line wrap: on
line source
#include "config.h" #include "pwplib.h" #define MAX_DESTRUCTORS 16 /******************** random stuff *************************/ void pwplib_dummy(){} #define pwp_dummy pwplib_dummy void pwplib_dump_rast_plain() { TEMPMALL(u8,tmp,pwplib.videobuf.width*pwplib.videobuf.height*2); u8 *d=tmp, *parentbuf=pwplib.videobuf.d, *s=parentbuf; int i=pwplib.videobuf.width*pwplib.videobuf.height; for(;i;i--) { #ifdef DRIVE_WIN32 d[0]=176; #else d[0]='%'; #endif d[1]=*s++; d+=2; } pwplib.videobuf.d=tmp; pwplib.dump_attr(); pwplib.videobuf.d=parentbuf; TEMPFREE(tmp); } /********************* timer (unix) ************************/ #define TIMERHZ 72 int pwp_timer_nrt() { static int lastctr=0,framectr=0; if(pwplib.setup[SETUP_BPS]) { pwplib.timer_counter++; /* kludge */ return (pwplib.timer_counter*TIMERHZ)/(pwplib.setup[SETUP_BPS]>>3); } else { if(pwplib.timer_counter!=lastctr) { framectr++; lastctr=pwplib.timer_counter; } else pwplib.timer_counter++; return (framectr*TIMERHZ)/pwplib.setup[SETUP_FPS]; } } int pwplib_timer() { static int base=-1;int v; v=pwplib.timerfunc(); if(base==-1)base=v; return v-base; } /********************* destructors, signals etc **********/ void(*pwp_destr[MAX_DESTRUCTORS + 1])(); void pwplib_regdestr(void(*func)()) { static int curr = 0; if (curr < MAX_DESTRUCTORS) { pwp_destr[curr++] = func; pwp_destr[curr] = NULL; } else { pwpwrite("* FATAL! tried to register %d destructors where %d is max.\n", curr, MAX_DESTRUCTORS); exit(1); } } void pwplib_shutdown(void) { int i = 0; while(pwp_destr[i]!=NULL) pwp_destr[i++](); } /******************** initialization *********************/ int pwplib_init_common(void) { /*** base stuff ***/ pwplib.sound= pwplib.loopflush= pwplib.player= pwplib.dump_attr= pwplib.dump_rast= pwplib.prep_attr= pwplib.prep_rast= pwplib_dummy; pwp_destr[0]=NULL; return 1; } /***********************************************/ static void rmarg(int *argc, char *argv[], int n) { while (n < *argc) { argv[n] = argv[n + 1]; n++; } (*argc)--; } /*********************************************************************/ #define ARGC pwplib.argc #define ARGV pwplib.argv static void getopts(pwp_optab *opts, const int nopts) { int i; for (i = 0; i < nopts; i++) *(opts[i].var) = opts[i].dflt; for (i = 0; i < ARGC;) { int opt, match = 0, wh = -1, lev = 0; for (opt = 0; opt < nopts; opt++) { char *s1 = opts[opt].name; char *s0 = ARGV[i]; int ngl = 0, m = 0; while (*s0) { if (*s0=='-') ngl=0; else if (*s0=='+') ngl=1; else { m++; if (*s0=='\0' || *s1=='\0')break; else if ((*s0|32) != *s1) { m=0; break; } s1++; } s0++; } if (m > match) { match = m; lev = ngl; wh = opt; } } if (wh >= 0) { rmarg(&ARGC, ARGV, i); switch (opts[wh].type) { case OPT_BIN: *((int*)(opts[wh].var)) = lev; break; case OPT_NOT: *((int*)(opts[wh].var)) = 1 - lev; break; case OPT_ONE: *((int*)(opts[wh].var))=1; case OPT_INT: if (ARGV[i] != NULL) { *((int*)(opts[wh].var)) = atoi(ARGV[i]); rmarg(&ARGC, ARGV, i); } break; case OPT_STRING: if (ARGV[i] != NULL) { *((char**)(opts[wh].var)) = strdup(ARGV[i]); rmarg(&ARGC, ARGV, 1); } break; } } else i++; } } #undef ARGC #undef ARGV /************************************/ static pwp_optab main_options[] = { /* stuph */ { "help", OPT_ONE, (void*)0, (void*)&pwplib.setup[SETUP_WANTHELP] }, { "shutup", OPT_ONE, (void*)0, (void*)&pwplib.setup[SETUP_SHUTUP] }, { "infodelay", OPT_INT, (void*)100, (void*)&pwplib.set.infodelay }, /* general */ { "nosound", OPT_ONE, (void*)0, (void*)&pwplib.setup[SETUP_NOSOUND] }, { "novideo", OPT_ONE, (void*)0, (void*)&pwplib.setup[SETUP_NOVIDEO] }, /* video */ { "term", OPT_STRING, (void*)NULL, (void*)&pwplib.set.term }, { "lang", OPT_STRING, (void*)NULL, (void*)&pwplib.set.lang }, { "tty", OPT_BIN, (void*)0, (void*)&pwplib.setup[SETUP_TTY] }, /* obsolete? */ { "pvp", OPT_BIN, (void*)0, (void*)&pwplib.setup[SETUP_PVP] }, /* size */ { "height", OPT_INT, (void*)0, (void*)&pwplib.setup[SETUP_USERHEIGHT] }, { "width", OPT_INT, (void*)0, (void*)&pwplib.setup[SETUP_USERWIDTH] }, /* conversion */ { "trans", OPT_INT, (void*)-1, (void*)&pwplib.setup[SETUP_TRANS] }, { "colors", OPT_INT, (void*)-1, (void*)&pwplib.setup[SETUP_COLORS] }, { "raster", OPT_INT, (void*)-1, (void*)&pwplib.setup[SETUP_RASTER] }, { "halve", OPT_BIN, (void*)1, (void*)&pwplib.setup[SETUP_HALVE] }, /* tty-etc stuff */ { "fps", OPT_INT, (void*)0, (void*)&pwplib.setup[SETUP_FPS] }, { "bps", OPT_INT, (void*)0, (void*)&pwplib.setup[SETUP_BPS] }, { "minfps", OPT_INT, (void*)0, (void*)&pwplib.setup[SETUP_MINFPS] }, { "maxfps", OPT_INT, (void*)256, (void*)&pwplib.setup[SETUP_MAXFPS] }, { "lossy", OPT_BIN, (void*)0, (void*)&pwplib.setup[SETUP_LOSSY] }, { "fdelay", OPT_INT, (void*)0, (void*)&pwplib.set.framedelay }, { "fbytes", OPT_INT, (void*)500, (void*)&pwplib.set.framebytes }, /* audio options */ { "audev", OPT_STRING, (void*)NULL, (void*)&pwplib.set.audev }, { "volume", OPT_INT, (void*)32, (void*)&pwplib.setup[SETUP_VOLUME] }, #if (defined(DRIVE_SDL)) /* Graphical output related */ { "fs", OPT_ONE, (void*)0, (void*)&pwplib.setup[SETUP_FULLSCREEN] }, { "xres", OPT_INT, (void*)640, (void*)&pwplib.setup[SETUP_XRES] }, { "yres", OPT_INT, (void*)480, (void*)&pwplib.setup[SETUP_YRES] }, #endif }; void pwplib_printhelp(void) { printf( "usage: %s [options] where options include:\n\n" " help this text\n" "\n" " shutup be quiet - only output the essentials\n" " term s set terminal type to s (e.g. xterm-color, vt100, ansi)\n" " lang s set locale/language to s (e.g. en, fi)\n" " pvp output in pwp video phormat (stdout)\n" "\n" " nosound no sound\n" " novideo no video output\n" "\n" " height x set buffer height (default = fullwindow)\n" " width x set buffer width (default = fullwindow)\n" "\n" " volume v set soft volume to v (numeric, default 32)\n" " colors x color configuration: 0=16x16, 1=8fg 2=8bg, 3=8x8\n" " 8=monochrome, 9=vtattributes\n" " trans n charset: 1=ibm, 2=ascii, 3=ascii-pure\n" " raster n raster rendering mode: 0==fg+bg 1=fgonly 2=mono\n" " ascii pure ascii: no colors, no attributes\n" " nohalve always use one character cell to represent a pixel\n" "\n" " fbytes n bytes/frame threshold (optimize frame if exceeded)\n" " fdelay n delay after each frame (milliseconds)\n" "\n" " bps n non-rt: fix to n bits per second, no delay\n" " fps n non-rt: fix to n frames per second, no delay\n" "\n" #if (defined(DRIVE_SDL)) " fs full screen mode (SDL)\n" " xres x graphical x resolution (640)\n" " yres x graphical y resolution (480)\n" "\n" #endif , pwplib.argv[0]); } void pwplib_getopts() { getopts(main_options, sizeof(main_options) / sizeof(main_options[0])); if (pwplib.set.lang == NULL) pwplib.set.lang = pwp_get_locale(); }