code duplication
[netris.git] / util.c
diff --git a/util.c b/util.c
index b32592fe0da16e75c400584077619ec8ef622f28..92a890859a7bb5f701afa30a3614c04f2f0a9bed 100644 (file)
--- a/util.c
+++ b/util.c
@@ -15,8 +15,6 @@
  * You should have received a copy of the GNU General Public License
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- *
- * $Id: util.c,v 1.29 1999/05/16 06:56:33 mhw Exp $
  */
 
 #include "netris.h"
 #include <errno.h>
 #include <setjmp.h>
 
-static MyEventType AlarmGenFunc(EventGenRec *gen, MyEvent *event);
+#include "util.h"
 
-static EventGenRec alarmGen =
-               { &alarmGen, 0, FT_read, -1, AlarmGenFunc, EM_alarm };
+static MyEventType AlarmGenFunc(EventGenRec *gen, MyEvent *event);
+static EventGenRec alarmGen = {
+       &alarmGen, 0, FT_read, -1, AlarmGenFunc, EM_alarm
+};
 static EventGenRec *nextGen = &alarmGen;
 
-static sigjmp_buf close_env;
-
 static int myRandSeed = 1;
 
 static long baseTimeval;
 
-ExtFunc void AtExit(void (*handler)(void))
+
+void AtExit(void (*handler)(void))
 {
 #ifdef HAS_ON_EXIT
        on_exit((void *)handler, NULL);
@@ -53,116 +52,56 @@ ExtFunc void AtExit(void (*handler)(void))
 
 ///////////// HELP MESSAGES /////////////
 
-ExtFunc void Header(void)
-{
-       fprintf(stderr,
-         "NETRIS %s\t(c) 1994-1996,1999 Mark H. Weaver <mhw@netris.org>\n"
-         "          \t(c) 2002 Shiar <shiar@shiar.org>\n\n",
-         version_string);
-} //Header
-
-ExtFunc void Usage(void)
+void Header(void)
 {
-       Header();
        fprintf(stderr,
-         "Usage: netris <options>\n"
-         "\n"
-         "  -h, --help\t\tPrint this usage information\n"
-         "  -H, --info\t\tShow distribution and warranty information\n"
-         "  -R, --rules\t\tShow game rules\n"
-         "\n"
-         "  -S, --slowterm\tDisable inverse/bold/color for slow terminals\n"
-         "  -a, --ascii\t\tUse ascii characters\n"
-         "  -C, --color=0\t\tDisable color\n"
-         "\n"
-         "  -w, --wait\t\tWait for connection\n"
-         "  -c, --connect <host>\tInitiate connection\n"
-         "  -p, --port <port>\tSet port number (default is %d)\n"
-         "\n"
-         "  -i, --speed <sec>\tSet the initial step-down interval, in seconds\n"
-         "  -l, --level <lvl>\tBegin at a higher level (can be used as handicap)\n"
-         "  -k, --keys <keys>\tRemap keys (default is \"%s\" for cursors)\n"
-         "  -d, --dropmode\tDrops go into drop mode\n"
-         "  -D, --instadrop\tInstant drop\n"
-         "\n"
-         "  -r, --robot <cmd>\tExecute program to control the game instead of keyboard\n"
-         "  -F, --fair-robot\tUse fair robot interface\n"
-         "\n", DEFAULT_PORT, DEFAULT_KEYS);
+               "NETRIS %s\t(c) 1994-1996,1999 Mark H. Weaver <mhw@netris.org>\n"
+               "          \t(c) 2002 Shiar <shiar@shiar.org>\n\n",
+               version_string
+       );
 }
 
-ExtFunc void DistInfo(void)
-{
-       Header();
-       fprintf(stderr,
-         "This program is free software; you can redistribute it and/or modify\n"
-         "it under the terms of the GNU General Public License as published by\n"
-         "the Free Software Foundation; either version 2 of the License, or\n"
-         "(at your option) any later version.\n"
-         "\n"
-         "This program is distributed in the hope that it will be useful,\n"
-         "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
-         "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
-         "GNU General Public License for more details.\n"
-         "\n"
-         "You should have received a copy of the GNU General Public License\n"
-         "along with this program; if not, write to the Free Software\n"
-         "Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.\n"
-         "\n");
-} //DistInfo
-
-ExtFunc void Rules(void)
+void DistInfo(void)
 {
-       Header();
        fprintf(stderr,
-         "One player mode\n"
-         "---------------\n"
-         "Good old Tetris. Scoring is like on the GameBoy version (so try to\n"
-         "remove as many lines at once as you can). After removing ten lines\n"
-         "you go to the next level, which will be faster thus making the game\n"
-         "harder to play.\n"
-         "\n"
-         "Two player mode\n"
-         "---------------\n"
-         "It's just like normal T*tris except that when you clear more than\n"
-         "one row with a single piece, the other player receives penalty lines\n"
-         "For clearing 2, 3 or 4 rows, respectively 1, 2 or 4 junk rows will\n"
-         "be added to the bottom of your opponent's board respectively.\n"
-         "The junk rows have exactly one empty column, which will line up for\n"
-         "multiple rows.\n"
-         "\n"
-         "The longest surviving player wins the game.\n"
-         "\n");
-} //Rules
+               "This program is free software; you can redistribute it and/or modify\n"
+               "it under the terms of the GNU General Public License as published by\n"
+               "the Free Software Foundation; either version 2 of the License, or\n"
+               "(at your option) any later version.\n"
+               "\n"
+               "This program is distributed in the hope that it will be useful,\n"
+               "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+               "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+               "GNU General Public License for more details.\n"
+               "\n"
+               "You should have received a copy of the GNU General Public License\n"
+               "along with this program; if not, write to the Free Software\n"
+               "Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.\n"
+               "\n"
+       );
+}
 
 ///////////// RANDOM /////////////
 
-ExtFunc void InitUtil(void)
-{
-       SRandom(time(0));
-       if (sigsetjmp(close_env, 1)) exit(0);
-       signal(SIGINT, CatchInt);
-       ResetBaseTime();
-} //InitUtil
-
 /*
  * My really crappy random number generator follows
  * Should be more than sufficient for our purposes though
  */
-ExtFunc void SRandom(int seed)
+void SRandom(int seed)
 {
        Game.seed = seed;
        myRandSeed = seed % 31751 + 1;
-} //SRandom
+}
 
-ExtFunc int Random(int min, int max1)
+int Random(int min, int max1)
 { //return a random value
        myRandSeed = (myRandSeed * 31751 + 15437) % 32767;
        return myRandSeed % (max1 - min) + min;
-} //Random
+}
 
 ///////////// I/O /////////////
 
-ExtFunc int MyRead(int fd, void *data, int len)
+int MyRead(int fd, void *data, int len)
 {
        int result, left;
 
@@ -177,9 +116,9 @@ ExtFunc int MyRead(int fd, void *data, int len)
                        return result;
        }
        return len;
-} //MyRead
+}
 
-ExtFunc int MyWrite(int fd, void *data, int len)
+int MyWrite(int fd, void *data, int len)
 {
        int result, left;
 
@@ -194,11 +133,29 @@ ExtFunc int MyWrite(int fd, void *data, int len)
                        return result;
        }
        return len;
-} //MyWrite
+}
+
+///////////// CONFIG /////////////
+
+void WriteConf(void)
+{
+       FILE *file_out;
+
+       file_out = fopen(CONFIG_FILE, "w");
+       if (file_out == NULL) {
+               perror("Error writing config file");
+               exit(1);
+       }
+
+       fprintf(file_out, "### NETRIS %s Config file ###\n\n", version_string);
+
+       fclose(file_out);
+       fprintf(stderr, "Wrote new game configuration to %s\n", CONFIG_FILE);
+}
 
 ///////////// TIME /////////////
 
-ExtFunc void NormalizeTime(struct timeval *tv)
+void NormalizeTime(struct timeval *tv)
 {
        tv->tv_sec += tv->tv_usec / 1000000;
        tv->tv_usec %= 1000000;
@@ -208,12 +165,7 @@ ExtFunc void NormalizeTime(struct timeval *tv)
        }
 }
 
-ExtFunc void CatchInt(int sig)
-{
-       siglongjmp(close_env, 1);
-}
-
-ExtFunc void CatchAlarm(int sig)
+void CatchAlarm(int sig)
 {
        alarmGen.ready = 1;
        signal(SIGALRM, CatchAlarm);
@@ -224,47 +176,44 @@ static MyEventType AlarmGenFunc(EventGenRec *gen, MyEvent *event)
        return E_alarm;
 }
 
-ExtFunc void SetTimeval(struct timeval *tv, long usec)
+void SetTimeval(struct timeval *tv, long usec)
 {
        tv->tv_sec = usec / 1000000;
        tv->tv_usec = usec % 1000000;
-} //SetTimeval
+}
 
-ExtFunc long GetTimeval(struct timeval *tv)
+long GetTimeval(struct timeval *tv)
 {
        return tv->tv_sec * 1000000 + tv->tv_usec;
-} //GetTimeval
+}
 
-ExtFunc long AbsTimeval(void)
+long AbsTimeval(void)
 {
        struct timeval tv;
 
        gettimeofday(&tv, NULL);
        return GetTimeval(&tv);
-} //CurTimeval
+}
 
-ExtFunc void ResetBaseTime(void)
-{
+void ResetBaseTime(void)
+{ //Reset the timer
        baseTimeval = AbsTimeval();
-} //ResetBaseTime
+}
 
-ExtFunc void PauseTime(void)
-{
+void PauseTime(void)
+{ //Pause the timer
        baseTimeval -= AbsTimeval();
-} //PauseTime
+}
 
-ExtFunc void ResumeTime(void)
-{
+void ResumeTime(void)
+{ //Unpause timer
        baseTimeval += AbsTimeval();
-} //ResumeTime
+}
 
-ExtFunc long CurTimeval(void)
+long CurTimeval(void)
 {
-       struct timeval tv;
-
-       gettimeofday(&tv, NULL);
-       return GetTimeval(&tv) - baseTimeval;
-} //CurTimeval
+       return AbsTimeval() - baseTimeval;
+}
 
 static long SetITimer1(long interval, long value)
 {
@@ -278,7 +227,7 @@ static long SetITimer1(long interval, long value)
        return GetTimeval(&old.it_value);
 }
 
-ExtFunc long SetITimer(long interval, long value)
+long SetITimer(long interval, long value)
 {
        long old;
 
@@ -290,19 +239,19 @@ ExtFunc long SetITimer(long interval, long value)
 
 ///////////// ... /////////////
 
-ExtFunc volatile void die(char *msg)
+volatile void die(char *msg)
 {
        perror(msg);
        exit(1);
 }
 
-ExtFunc volatile void fatal(char *msg)
+volatile void fatal(char *msg)
 {
        fprintf(stderr, "%s\n", msg);
        exit(1);
 }
 
-ExtFunc void BlockSignals(MySigSet *saved, ...)
+void BlockSignals(MySigSet *saved, ...)
 {
        MySigSet set;
        va_list args;
@@ -329,7 +278,7 @@ ExtFunc void BlockSignals(MySigSet *saved, ...)
        va_end(args);
 }
 
-ExtFunc void RestoreSignals(MySigSet *saved, MySigSet *set)
+void RestoreSignals(MySigSet *saved, MySigSet *set)
 {
 #ifdef HAS_SIGPROCMASK
        sigprocmask(SIG_SETMASK, set, saved);
@@ -343,14 +292,14 @@ ExtFunc void RestoreSignals(MySigSet *saved, MySigSet *set)
 
 ///////////// EVENTS /////////////
 
-ExtFunc void AddEventGen(EventGenRec *gen)
+void AddEventGen(EventGenRec *gen)
 {
        assert(gen->next == NULL);
        gen->next = nextGen->next;
        nextGen->next = gen;
-} //AddEventGen
+}
 
-ExtFunc void RemoveEventGen(EventGenRec *gen)
+void RemoveEventGen(EventGenRec *gen)
 {
        // assert(gen->next != NULL);   /* Be more forgiving, for SIGINTs */
        if (gen->next) {
@@ -359,9 +308,9 @@ ExtFunc void RemoveEventGen(EventGenRec *gen)
                nextGen->next = gen->next;
                gen->next = NULL;
        }
-} //RemoveEventGen
+}
 
-ExtFunc MyEventType WaitMyEvent(MyEvent *event, int mask)
+MyEventType WaitMyEvent(MyEvent *event, int mask)
 { //poll
        int i, retry = 0;
        fd_set fds[FT_len];
@@ -389,7 +338,7 @@ ExtFunc MyEventType WaitMyEvent(MyEvent *event, int mask)
                        tv.tv_sec = 0;
                        tv.tv_usec = (retry && !anyReady) ? 500000 : 0;
                        result = select(FD_SETSIZE, &fds[FT_read], &fds[FT_write],
-                                       &fds[FT_except], anyReady ? &tv : NULL);
+                                       &fds[FT_except], anyReady ? &tv : NULL);
                }
                else {
                        if (retry && !anyReady)
@@ -398,9 +347,10 @@ ExtFunc MyEventType WaitMyEvent(MyEvent *event, int mask)
                }
                gen = nextGen;
                do {
-                       if ((gen->mask & mask)
-                                       && (gen->ready || (result > 0 && gen->fd >= 0
-                                               && FD_ISSET(gen->fd, &fds[gen->fdType])))) {
+                       if ((gen->mask & mask) && (gen->ready || (
+                               result > 0 && gen->fd >= 0
+                               && FD_ISSET(gen->fd, &fds[gen->fdType])
+                       ))) {
                                gen->ready = 0;
                                event->type = gen->func(gen, event);
                                if (event->type != E_none) {
@@ -412,9 +362,5 @@ ExtFunc MyEventType WaitMyEvent(MyEvent *event, int mask)
                } while (gen != nextGen);
                retry = 1;
        }
-} //WaitMyEvent
+}
 
-/*
- * vi: ts=4 ai
- * vim: noai si
- */