tsitest.c++
上传用户:weiyuanprp
上传日期:2020-05-20
资源大小:1169k
文件大小:5k
源码类别:

传真(Fax)编程

开发平台:

C/C++

  1. /* $Id: tsitest.c++,v 1.4 2006/06/22 15:06:36 faxguy Exp $ */
  2. /*
  3.  * Copyright (c) 1994-1996 Sam Leffler
  4.  * Copyright (c) 1994-1996 Silicon Graphics, Inc.
  5.  * HylaFAX is a trademark of Silicon Graphics
  6.  *
  7.  * Permission to use, copy, modify, distribute, and sell this software and 
  8.  * its documentation for any purpose is hereby granted without fee, provided
  9.  * that (i) the above copyright notices and this permission notice appear in
  10.  * all copies of the software and related documentation, and (ii) the names of
  11.  * Sam Leffler and Silicon Graphics may not be used in any advertising or
  12.  * publicity relating to the software without the specific, prior written
  13.  * permission of Sam Leffler and Silicon Graphics.
  14.  * 
  15.  * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, 
  16.  * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY 
  17.  * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.  
  18.  * 
  19.  * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
  20.  * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
  21.  * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
  22.  * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF 
  23.  * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE 
  24.  * OF THIS SOFTWARE.
  25.  */
  26. /*
  27.  * Interactive program for TSI checking support.
  28.  *
  29.  * Usage: tsitest [tsifile]
  30.  */
  31. #include <sys/types.h>
  32. #include <sys/stat.h>
  33. #include <stdio.h>
  34. #include <ctype.h>
  35. #include <string.h>
  36. #include <stdlib.h>
  37. #include <unistd.h>
  38. #include "REArray.h"
  39. #include "BoolArray.h"
  40. #include "Str.h"
  41. #include "Sys.h"
  42. fxStr qualifyTSI;
  43. REArray* tsiPats = NULL; // recv tsi patterns
  44. fxBoolArray* acceptTSI = NULL; // accept/reject matched tsi
  45. time_t lastPatModTime = 0; // last mod time of patterns file
  46. /*
  47.  * Read the file of TSI patterns into an array.
  48.  *
  49.  * The order of patterns is preserved and a leading ``!''
  50.  * is interpreted to mean ``reject TSI if matched by this
  51.  * regex''.  Note also that we always allocate an array
  52.  * of patterns.  The TSI pattern matching logic rejects
  53.  * TSI that don't match any patterns.  Thus an empty file
  54.  * causes all incoming facsimile to be rejected.
  55.  */
  56. void
  57. readTSIPatterns(FILE* fd, REArray*& pats, fxBoolArray*& accept)
  58. {
  59.     if (pats)
  60. pats->resize(0);
  61.     else
  62. pats = new REArray;
  63.     if (accept)
  64. accept->resize(0);
  65.     else
  66. accept = new fxBoolArray;
  67.     char line[256];
  68.     while (fgets(line, sizeof (line)-1, fd)) {
  69. char* cp = strchr(line, '#');
  70. if (cp || (cp = strchr(line, 'n')))
  71.     *cp = '';
  72. /* trim off trailing white space */
  73. for (cp = strchr(line, ''); cp > line; cp--)
  74.     if (!isspace(cp[-1]))
  75. break;
  76. *cp = '';
  77. if (line[0] == '')
  78.     continue;
  79. RE* re;
  80. if (line[0] == '!') {
  81.     accept->append(false);
  82.     pats->append(re = new RE(line+1));
  83. } else {
  84.     accept->append(true);
  85.     pats->append(re = new RE(line));
  86. }
  87. if (re->getErrorCode() > REG_NOMATCH) {
  88.     fxStr emsg;
  89.     re->getError(emsg);
  90.     printf("Bad TSI pattern: %s: " | emsg | ".n", re->pattern());
  91. }
  92.     }
  93. }
  94. /*
  95.  * Update the TSI pattern arrays if the file
  96.  * of TSI patterns has been changed since the last
  97.  * time we read it.
  98.  */
  99. void
  100. updateTSIPatterns()
  101. {
  102.     FILE* fd = fopen((const char*) qualifyTSI, "r");
  103.     if (fd != NULL) {
  104. struct stat sb;
  105. if (fstat(fileno(fd), &sb) >= 0 && sb.st_mtime >= lastPatModTime) {
  106.     readTSIPatterns(fd, tsiPats, acceptTSI);
  107.     lastPatModTime = sb.st_mtime;
  108. }
  109. fclose(fd);
  110.     } else if (tsiPats) {
  111. // file's been removed, delete any existing info
  112. delete tsiPats, tsiPats = NULL;
  113. delete acceptTSI, acceptTSI = NULL;
  114.     }
  115. }
  116. extern void fxFatal(const char* va_alist ...);
  117. static const char* appName;
  118. static void
  119. usage()
  120. {
  121.     fxFatal("usage: %s [-q] tsifile", appName);
  122. }
  123. static int
  124. prompt()
  125. {
  126.     printf("ready> "); fflush(stdout);
  127.     return (1);
  128. }
  129. int
  130. main(int argc, char* argv[])
  131. {
  132.     bool verbose = true;
  133.     extern int optind;
  134.     int c;
  135.     appName = argv[0];
  136.     while ((c = Sys::getopt(argc, argv, ":q")) != -1)
  137. switch (c) {
  138. case 'q':
  139.     verbose = false;
  140.     break;
  141. case '?':
  142.     usage();
  143.     /*NOTREACHED*/
  144. }
  145.     if (argc - optind != 1)
  146. usage();
  147.     qualifyTSI = argv[optind];
  148.     updateTSIPatterns();
  149.     char line[1024];
  150.     while (prompt() && fgets(line, sizeof (line), stdin)) {
  151. char* cp = strchr(line, 'n');
  152. if (cp)
  153.     *cp = '';
  154. if (verbose)
  155.     printf("input = "%s"n", line);
  156. updateTSIPatterns();
  157. if (tsiPats != NULL) {
  158.     u_int i;
  159.     for (i = 0; i < tsiPats->length(); i++) {
  160. RE* pat = (*tsiPats)[i];
  161. if (verbose)
  162.     printf("[check %s]n", pat->pattern());
  163. fxStr tsi(line);
  164. if (pat->Find(tsi)) {
  165.     printf("%s (matched by %s)n",
  166. (*acceptTSI)[i] ? "accept" : "reject",
  167. pat->pattern());
  168.     break;
  169. }
  170.     }
  171.     if (i == tsiPats->length())
  172. printf("reject (no pattern match)n");
  173. } else
  174.     printf("reject (no patterns)n");
  175.     }
  176.     return (0);
  177. }