Logo Search packages:      
Sourcecode: xbuffy version File versions  Download package

boxfile.c

/*******************************************************************************

     Copyright (c) 1994,1995    William Pemberton (wfp5p@virginia.edu)

     The X Consortium, and any party obtaining a copy of these files from
     the X Consortium, directly or indirectly, is granted, free of charge, a
     full and unrestricted irrevocable, world-wide, paid up, royalty-free,
     nonexclusive right and license to deal in this software and
     documentation files (the "Software"), including without limitation the
     rights to use, copy, modify, merge, publish, distribute, sublicense,
     and/or sell copies of the Software, and to permit persons who receive
     copies from any such party to do so.  This license includes without
     limitation a license to do the foregoing actions under any patents of
     the party supplying this software to the X Consortium.

*******************************************************************************/


#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include "xbuffy.h"

#define cmpTok(tok,str,tokVal) {if ( strcmp(tok,str) == 0) return(tokVal);}

extern ApplicationData_t data;

static char *tokens[20] = {
      "box", "title", "command", "audio", "mailbox", "newsbox", "origmode",
      "newmode", "beep", "nobeep", "last", "headertime", "polltime",
      "shortname", "longname", "background", "foreground", 
#ifdef USE_LED
      "led", 
#endif
      NULL
};

enum TokType
{
      UNK_T = 0, BOX_T, TITLE_T, COMMAND_T, AUDIO_T, MAILBOX_T, NEWSBOX_T,
      ORIGMODE_T, NEWMODE_T, BEEP_T, NOBEEP_T, LAST_T, HEADER_T, POLL_T,
      SHORT_T, LONG_T, BG_T, FG_T
#ifdef USE_LED
        , LED_T
#endif
};

typedef enum TokType TokenType;

TokenType token(line, next)
      char *line;
      char *next;
{
      char tok[30];
      char *p1;
      int x;

      p1 = line;
      x = 0;

      while ((*p1 != '\0') && (isspace(*p1)))
            p1++;

      while ((*p1 != '\0') && (!isspace(*p1)) && (x < 29))
      {
            tok[x++] = (isupper(*p1) ? tolower(*p1) : *p1);
            p1++;
      }
      tok[x] = '\0';

      while ((*p1 != '\0') && (isspace(*p1)))
            p1++;

      strcpy(next, p1);
        if (NEWstrlen(next))
          next[NEWstrlen(next) - 1] = '\0';     /* strip the newline */

      for (x = 0; tokens[x] != NULL; x++)
      {
            if (strcmp(tok, tokens[x]) == 0)
              return (x + 1);
      }
      return (UNK_T);

}


void clearBox(tempBox)
      BoxInfo_t *tempBox;
{
      if (tempBox->box != NULL)
      {
            free(tempBox->box);
            tempBox->box = NULL;
      }

      if (tempBox->command != NULL)
      {
            free(tempBox->command);
            tempBox->command = NULL;
      }

      if (tempBox->audioCmd != NULL)
      {
            free(tempBox->audioCmd);
            tempBox->audioCmd = NULL;
      }

      if (tempBox->boxTitle != NULL)
      {
            free(tempBox->boxTitle);
            tempBox->boxTitle = NULL;
      }
   
      if (tempBox->bgName != NULL)
      {
            free(tempBox->bgName);
            tempBox->bgName = NULL;
      }

            if (tempBox->fgName != NULL)
      {
            free(tempBox->fgName);
            tempBox->fgName = NULL;
      }

   

      tempBox->type = 0;
      tempBox->last = 0;
      tempBox->headerTime = tempBox->nobeep = tempBox->origMode = 0;
      tempBox->pollTime = tempBox->headerTime = -1;
#ifdef USE_LED
      tempBox->pid = 0;
      tempBox->led = -1;
#endif
      tempBox->BoxNameType = UNDEF;
}


char *parseTwiddle(str)
      char *str;
{
      static char retVal[MAX_STRING];
      char *ptr, *res;
      char *home;

      ptr = str;
      res = retVal;

      while (*ptr != '\0')
      {
            if (*ptr == '~')
            {
                  home = (char *) getenv("HOME");
                  strcpy(res, home);
                  res += NEWstrlen(home);
            }
            else
                  *(res++) = *ptr;

            ++ptr;
      }
      *res = '\0';

      return (retVal);
}

char *parseEnv(str)
   char *str;
{
   static char retVal[MAX_STRING];
   char envStr[MAX_STRING];
   char *ptr,*res;
   char *envValue,*envPtr;
   
   ptr = str;
   envPtr = envStr;
   res = retVal;
   
   while (*ptr != '\0')
   {
      if (*ptr == '{')
      {
       ptr++;
       while ( (*ptr != '\0') && (*ptr != '}') )
       {
          *envPtr = *ptr;
          ptr++;
          envPtr++;
       }
       if (*ptr == '}')
         ptr++;
       
       *envPtr = '\0';
       envValue = (char *)getenv(envStr);
       strcpy(res,envValue);
       res+=NEWstrlen(envValue);
       
      }
      else
      {
       *(res++) = *ptr;
         ++ptr;
      }
   }
   *res = '\0';
   
   return(retVal);
}


#ifdef TESTBOX

char *showNull(w)
      char *w;

{
      if (w == NULL)
            return ("NULL");
      else
            return (w);
}

void dumpBox(tempBox)
      BoxInfo_t tempBox;
{
      printf("Dumping Box = *%s*\n", tempBox.box);
      printf("type = %i\n", tempBox.type);
      printf("command   = *%s*\n", showNull(tempBox.command));
      printf("audio = *%s*\n", showNull(tempBox.audioCmd));
      printf("boxTitle = *%s*\n", showNull(tempBox.boxTitle));
      printf("pollTime = %i  headerTime = %i\n", tempBox.pollTime, tempBox.headerTime);
      printf("nobeep = %i  origMode = %i \n", tempBox.nobeep, tempBox.origMode);
      printf("nametype = %i\n\n", tempBox.BoxNameType);
}

#endif



void readBoxfile(boxFile)
      char *boxFile;
{
      BoxInfo_t tempBox;
      FILE *boxes;
      char line[MAX_STRING];
      int inBox;
      char next[MAX_STRING];

      tempBox.bgName = tempBox.fgName = tempBox.box = tempBox.command = tempBox.audioCmd = tempBox.boxTitle = NULL;
#ifdef USE_LED
      tempBox.led = -1;
#endif
      clearBox(&tempBox);


      if ((boxes = fopen(boxFile, "r")) == 0)
      {
            fprintf(stderr, "Could not open boxfile %s\n", boxFile);
            return;
      }

      inBox = 0;

      while (fgets(line, MAX_STRING - 2, boxes) != 0)
      {
            line[MAX_STRING - 1] = '\0'; /* just in case */

            if (line[0] == '#')           /* it's a comment */
                  continue;

            switch (token(line, next))
            {
            case BOX_T:
                  if (inBox)
                  {
#ifndef TESTBOX

                        initBox(tempBox.box,
                                    tempBox.type, tempBox.pollTime,
                                    tempBox.headerTime, tempBox.BoxNameType,
                                    tempBox.command,
                                    tempBox.audioCmd,
                                    tempBox.boxTitle,
                                    tempBox.origMode, 
                                    tempBox.nobeep,
                                    tempBox.bgName, 
                                    tempBox.fgName
# ifdef USE_LED
                                    , tempBox.led
# endif
                                    );

#else
                        dumpBox(tempBox);
#endif
                        clearBox(&tempBox);
                  }

                  tempBox.box = (char *) strdup(parseTwiddle(parseEnv(next)));
                  inBox = TRUE;


                  break;

            case TITLE_T:
                  tempBox.boxTitle = (char *) strdup(next);
                  tempBox.BoxNameType = USR;
                  break;

            case COMMAND_T:
                  tempBox.command = (char *) strdup(next);
                  break;

            case AUDIO_T:
                  tempBox.audioCmd = (char *) strdup(next);
                  break;

            case MAILBOX_T:
                  tempBox.type = MAILBOX;
                  break;

            case NEWSBOX_T:
                  tempBox.type = NNTPBOX;
                  break;

            case ORIGMODE_T:
                  tempBox.origMode = TRUE;
                  break;

            case NEWMODE_T:
                  tempBox.origMode = FALSE;
                  break;

            case BEEP_T:
                  tempBox.nobeep = FALSE;
                  break;

            case NOBEEP_T:
                  tempBox.nobeep = TRUE;
                  break;

            case LAST_T:
                  tempBox.last = atoi(next);
                  break;

            case HEADER_T:
                  tempBox.headerTime = atoi(next);
                  break;

            case POLL_T:
                  tempBox.pollTime = atoi(next);
                  break;

            case SHORT_T:
                  tempBox.BoxNameType = SHORT;
                  break;

            case LONG_T:
                  tempBox.BoxNameType = LONG;
                  break;

                case BG_T:
                    tempBox.bgName = (char *) strdup(next);
                    break;

              case FG_T:
                    tempBox.fgName = (char *) strdup(next);
                    break;

#ifdef USE_LED
            case LED_T:
                  tempBox.led = atoi(next);
                  break;
#endif
            default:
                  break;
            }

      }                                         /* while */

      if (inBox)
#ifndef TESTBOX
            initBox(tempBox.box,
                        tempBox.type, tempBox.pollTime,
                        tempBox.headerTime, tempBox.BoxNameType,
                        tempBox.command,
                        tempBox.audioCmd,
                        tempBox.boxTitle,
                        tempBox.origMode, 
                        tempBox.nobeep, 
                        tempBox.bgName,
                        tempBox.fgName
# ifdef USE_LED
                        , tempBox.led
# endif
                        );
#else
            dumpBox(tempBox);
#endif

      fclose(boxes);

}



#ifdef TESTBOX

main()
{


      readBoxfile("boxfile.sample");
}

#endif

Generated by  Doxygen 1.6.0   Back to index