diff pwplib/setup.c @ 0:acb5694e93d9

Initial import.
author Matti Hamalainen <ccr@tnsp.org>
date Tue, 18 May 2010 04:25:44 +0300
parents
children c60e531d19cd
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/pwplib/setup.c	Tue May 18 04:25:44 2010 +0300
@@ -0,0 +1,318 @@
+#include "config.h"
+#include "pwplib.h"
+
+#define DESTRUCTORS 8
+
+/******************** 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[DESTRUCTORS])();
+
+void pwp_regdestr(void(*func)())
+{
+   static int curr=0;
+   pwp_destr[curr++]=func;
+   pwp_destr[curr]=NULL;
+}
+
+void pwplib_shutdown()
+{
+   int i=0;
+
+   while(pwp_destr[i]!=NULL)
+         pwp_destr[i++]();
+}
+
+/******************** initialization *********************/
+
+int pwplib_init_common()
+{
+   /*** 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;
+}
+
+/***********************************************/
+
+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
+int getopts(optab*argin)
+{
+   int i=0;
+   
+   {optab*s0=argin;
+    while(s0->name!=NULL)
+    {
+       *(s0->var)=s0->dflt;
+       s0++;
+    }
+   }
+
+   for(i=0;i<ARGC;)
+   {
+      int j=0;
+      
+      int match=0,wh=-1,lev=0,m=0;
+
+      while(argin[j].name!=NULL)
+      {
+         char*s1=argin[j].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=j;
+         }
+         j++;
+      }
+      
+      if(wh>=0)
+      {
+        rmarg(&ARGC,ARGV,i);
+      
+        switch((int)argin[wh].type)
+        {
+           case(OPT_BIN):
+              *((int*)(argin[wh].var))=lev;
+              break;
+
+           case(OPT_NOT):
+              *((int*)(argin[wh].var))=1-lev;
+              break;
+
+           case(OPT_ONE):
+              *((int*)(argin[wh].var))=1;
+
+           case(OPT_INT):
+              if(ARGV[i]!=NULL)
+              {
+                 *((int*)(argin[wh].var))=atoi(ARGV[i]);
+                 rmarg(&ARGC,ARGV,i);
+              }
+              break;
+         
+           case(OPT_STRING):
+              if(ARGV[i]!=NULL)
+              {
+                 *((char**)(argin[wh].var))=strdup(ARGV[i]);
+                 rmarg(&ARGC,&ARGV,1);
+              }
+              break;
+        }
+      }
+       else i++;
+   }
+}
+#undef ARGC
+#undef ARGV
+
+/************************************/
+
+optab main_init[]=
+{
+   /* 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],
+
+   NULL,0,NULL,NULL
+};
+
+void printhelp()
+{
+         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",pwplib.argv[0]);
+}
+
+void pwplib_getopts()
+{
+   getopts(main_init);
+
+   if(pwplib.set.lang==NULL)
+      pwplib.set.lang=pwp_get_locale();
+}
+