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

传真(Fax)编程

开发平台:

C/C++

  1. /* $Id: typetest.c++,v 1.2 2006/06/22 04:11:37 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.  * Program for testing out typerules.
  28.  *
  29.  * Usage: typetest [-f rulesfile] files
  30.  */
  31. #include "Sys.h"
  32. #include <stdlib.h>
  33. #include <stdarg.h>
  34. #include <sys/stat.h>
  35. #include "TypeRules.h"
  36. #include "config.h"
  37. TypeRules* typeRules;
  38. /*
  39.  * Return a TypeRule for the specified file.
  40.  */
  41. const TypeRule*
  42. fileType(const char* filename)
  43. {
  44.     struct stat sb;
  45.     int fd = open(filename, O_RDONLY);
  46.     if (fd < 0) {
  47. fprintf(stderr, "%s: Can not open filen", filename);
  48. return (NULL);
  49.     }
  50.     if (fstat(fd, &sb) < 0) {
  51. fprintf(stderr, "%s: Can not stat filen", filename);
  52. close(fd);
  53. return (NULL);
  54.     }
  55.     if ((sb.st_mode & S_IFMT) != S_IFREG) {
  56. fprintf(stderr, "%s: Not a regular filen", filename);
  57. close(fd);
  58. return (NULL);
  59.     }
  60.     char buf[512];
  61.     int cc = read(fd, buf, sizeof (buf));
  62.     close(fd);
  63.     if (cc == 0) {
  64. fprintf(stderr, "%s: Empty filen", filename);
  65. return (NULL);
  66.     }
  67.     const TypeRule* tr = typeRules->match(buf, cc);
  68.     if (!tr) {
  69. fprintf(stderr, "%s: Can not determine file typen", filename);
  70. return (NULL);
  71.     }
  72.     if (tr->getResult() == TypeRule::ERROR) {
  73. fxStr emsg(tr->getErrMsg());
  74. fprintf(stderr, "%s: %sn", filename, (const char*) emsg);
  75. return (NULL);
  76.     }
  77.     return tr;   
  78. }
  79. char* appName;
  80. void
  81. usage()
  82. {
  83.     fprintf(stderr, "usage: %s [-f rulesfile] filesn", appName);
  84.     exit(-1);
  85. }
  86. int
  87. main(int argc, char* argv[])
  88. {
  89.     extern int optind;
  90.     extern char* optarg;
  91.     int c;
  92.     fxStr file;
  93.     appName = argv[0];
  94.     file = FAX_LIBDATA "/" FAX_TYPERULES;
  95.     while ((c = Sys::getopt(argc, argv, "f:")) != -1)
  96. switch (c) {
  97. case 'f':
  98.     file = optarg;
  99.     break;
  100. case '?':
  101.     usage();
  102.     /*NOTREACHED*/
  103. }
  104.     if (argc - optind < 1)
  105. usage();
  106.     typeRules = TypeRules::read(file);
  107.     if (!typeRules) {
  108. fprintf(stderr, "Unable to setup file typing and conversion rulesn");
  109. return (-1);
  110.     }
  111.     typeRules->setVerbose(true);
  112.     for (; optind < argc; optind++)
  113. (void) fileType(argv[optind]);
  114.     return (0);
  115. }