/******************************************************************************* 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 #include #include #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