home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / 1988 / 03 / c_abc / minifil.c < prev    next >
Encoding:
C/C++ Source or Header  |  1988-01-05  |  3.4 KB  |  112 lines

  1. /****************************************************************
  2.  *                    MINIFILTER                                *
  3.  *              (C) PASCAL INTERNATIONAL                        *
  4.  ****************************************************************/
  5. #include <stdio.h>
  6. #define NOVOID   /* Compiler kennt kein void eventuell weglassen*/
  7. #ifdef NOVOID
  8. #define void /* */ 
  9. #endif
  10. #define B_READ  "br"     /* modus für lesen  bei fopen()        */
  11. #define B_WRITE "bw"     /*  "      schreiben    "              */
  12.                          /* bitte im Compilerhandbuch nachsehen */
  13. #define AND    1         /* als Symbole zur besseren Lesbarkeit */
  14. #define OR     2
  15. #define XOR    3
  16. #define FEHLER 999
  17. /* Makros         */
  18. #define islower(c) ((c)>='a' && (c)<='z')  /* Kleinbuchstabe ?  */
  19. #define toupper(c) (islower(c) ? (c)-32 : (c)) /* mache gro₧    */
  20. #define ishex(c) (((c) >= '0' && (c) <= '9')||((c) >= 'A' && (c) <= 'F'))
  21.                                            /* Hexziffer ? */
  22. /* Einige Deklarationen */
  23. FILE *fopen();
  24. int fgetc();
  25. int strcmp();
  26. int strlen();
  27. int hole_operator();
  28. int hole_maske();
  29. int transform();
  30. void error();
  31.  
  32. /* globale Variablen    */
  33. int op;      /* Operator    */
  34. int mask;    /* Maske       */
  35.  
  36. main(argc,argv)
  37. int argc;
  38. char *argv[];
  39. {
  40. FILE *in,*out;     /* Filepointer für Ein- Ausgabe              */
  41. int c;             /* Zeichen         */
  42. if(argc < 5)       /* Wir brauchen 5 Argumente                  */
  43.   error("Argumente: Quelle Ziel Operator Maske\n");
  44.  
  45. if((op = hole_operator(argv[3])) == FEHLER) error("falscher Operator\n");
  46. if((mask = hole_maske(argv[4])) == FEHLER) error("falsche Konstante\n");
  47. if(!(in = fopen(argv[1],B_READ))) error("Quelle nicht zu öffnen\n");
  48. if(!(out = fopen(argv[2],B_WRITE))) error("Ziel nicht zu öffnen\n");
  49. while((c = fgetc(in)) != EOF) fputc(transform(c),out);
  50. fclose(in);  fclose(out);
  51. puts("F E R T I G\n");
  52. getchar();
  53. exit(0);
  54. }
  55.  
  56. int hole_operator(str)
  57. char str[];
  58. {
  59. int j = -1;
  60. while(str[++j])       /* ist wahr bis Ende erreicht wird: '\0'  */
  61.   str[j] = toupper(str[j]);   /* umgewandelt in Großbuchstaben  */
  62. if(!strcmp(str,"AND")) return(AND); /* strcpy liefert 0 bei Gleichheit  */
  63. else if(!strcmp(str,"OR")) return(OR);
  64. else if(!strcmp(str,"XOR")) return(XOR);
  65. else return(FEHLER);
  66. }
  67.  
  68. /* hole_maske()      */
  69.    Jedes Z kann '0' bis '9' oder 'A' bis 'F' sein.
  70.    Für '0' bis '9' erhält man durch subtrahieren von 48 die
  71.    korrespondierende Zahl ( '1' ist z. B. 49).
  72.    Für 'A' bis 'F' mu₧ 55 abgezogen werden ( 'A' ist 65).
  73.    str[2] ist dann noch mit 16 zu multiplizieren.               */
  74.  
  75. int hole_maske(str)
  76. char str[];
  77. {
  78. int j = -1;
  79. int zahl = 0;
  80. while(str[++j])    /* ist wahr bis Ende erreicht wird: '\0'     */
  81.   str[j] = toupper(str[j]);   /* umgewandelt in Gro₧buchstaben  */
  82. if(   str[0] != '0' || str[1] != 'X' || strlen(str) != 4
  83.       || !ishex(str[2]) || !ishex(str[3]) )
  84.   return(FEHLER);
  85. if(str[2] < 'A') zahl += (str[2] - 48) * 16; /* zwischen 0 und 9 */
  86. else zahl += (str[2] - 55) * 16;             /* zwischen A und F */
  87. if(str[3] < 'A') zahl += str[3] - 48;
  88. else zahl += str[3] - 55;
  89. return(zahl);
  90. }
  91.  
  92. int transform(c)
  93. int c;
  94. {
  95. switch(op)
  96.   {
  97.     case AND: c &= mask;
  98.               break;
  99.     case OR:  c |= mask;
  100.               break;
  101.     case XOR: c ^= mask;
  102.   }
  103. return(c);
  104. }
  105.  
  106. void error(s)
  107. char s[];
  108. {
  109. puts(s);  getchar();  exit(1);
  110. }
  111.  
  112.