SASC
DVBSoftCAM

filterhelper.c

Go to the documentation of this file.
00001 
00002 #include <stdlib.h>
00003 #include <stdio.h>
00004 #include <unistd.h>
00005 #include <string.h>
00006 
00007 int main(int argc, char *argv[])
00008 {
00009   unsigned char match[256];
00010   int i, max;
00011   int filt, mask, mode;
00012   int mam, manm;
00013 
00014   if(argc<2) {
00015     printf("missing operation mode\n");
00016     exit(1);
00017     }
00018   if(!strcasecmp(argv[1],"MATCH")) {
00019     if(argc<3) {
00020       printf("no matches given\n");
00021       exit(1);
00022       }
00023     memset(match,0,sizeof(match));
00024     printf("searching filter settings for:");
00025     for(i=2; i<argc; i++) {
00026       int l=strtol(argv[i],0,0);
00027       if(l<0 || l>255) {
00028         printf("allowed range 0-255 / 0x00-0xFF\n");
00029         exit(1);
00030         }
00031       match[l]=1;
00032       printf(" 0x%02x",l);
00033       }
00034     printf("\n");
00035 
00036     max=5;
00037     int mode=0;
00038     //for(mode=0; mode<256; mode++) {
00039       for(mask=0; mask<256; mask++) {
00040         mam =mask &  (~mode);
00041         manm=mask & ~(~mode);
00042         for(filt=0; filt<256; filt++) {
00043           int ok=1, miss=0;
00044           unsigned char mm[256];
00045           memset(mm,0,sizeof(mm));
00046           for(i=0; i<256; i++) {
00047             int xxor=filt^i;
00048             if((mam&xxor) || (manm && !(manm&xxor))) {
00049               if(match[i]!=0) {
00050                 ok=0;
00051                 miss=0;
00052                 break;
00053                 }
00054               }
00055             else {
00056               if(match[i]!=1) {
00057                 ok=0;
00058                 miss++; mm[i]=1;
00059                 if(miss>max) break;
00060                 }
00061               }
00062             }
00063 
00064           if(ok) {
00065             printf("found exact settings filt=%02x mask=%02x mode=%02x\n",filt,mask,mode);
00066             exit(0);
00067             }
00068           else if(miss>0 && miss<=max) {
00069             printf("mismatching");
00070             for(i=0; i<256; i++) if(mm[i]) printf(" %02x",i);
00071             printf(" - settings filt=%02x mask=%02x mode=%02x\n",filt,mask,mode);
00072             max=miss;
00073             }
00074           }
00075         }
00076       //}
00077     printf("no exact settings found\n");
00078     exit(1);
00079     }
00080   else if(!strcasecmp(argv[1],"TEST")) {
00081     if(argc<5) {
00082       printf("missing arguments\n");
00083       exit(1);
00084       }
00085     filt=strtol(argv[2],0,0);
00086     if(filt<0 || filt>255) {
00087       printf("filter range 0-255 exceeded\n");
00088       exit(1);
00089       }
00090     mask=strtol(argv[3],0,0);
00091     if(mask<0 || mask>255) {
00092       printf("mask range 0-255 exceeded\n");
00093       exit(1);
00094       }
00095     mode=strtol(argv[4],0,0);
00096     if(mode<0 || mode>255) {
00097       printf("mode range 0-255 exceeded\n");
00098       exit(1);
00099       }
00100     printf("settings file=%02x mask=%02x mode=%02x\n",filt,mask,mode);
00101 
00102     mam =mask &  (~mode);
00103     manm=mask & ~(~mode);
00104     printf("matching:");
00105     for(i=0; i<256; i++) {
00106       int xxor=filt^i;
00107       if((mam&xxor) || (manm && !(manm&xxor))) {}
00108       else
00109         printf(" %02x",i);
00110       }
00111     printf("\n");
00112     }
00113   else {
00114     printf("unknown operation mode\n");
00115     }
00116   exit(1);
00117 }
00118 
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines