home *** CD-ROM | disk | FTP | other *** search
/ The World of Computer Software / World_Of_Computer_Software-02-387-Vol-3of3.iso / t / test10.zip / ENCODE.C < prev    next >
C/C++ Source or Header  |  1993-01-22  |  18KB  |  899 lines

  1.  
  2. /*
  3.    ENCODE.C
  4.  
  5.    Encode Version 1.1  by David W. Sanderson, Mark K. Mathews
  6.  
  7.    Purpose: Creates VCR-Plus code from date and time of show.
  8.  
  9.  
  10. */
  11.  
  12. #include <dos.h>
  13. #include <stdio.h>
  14. #include <stdlib.h>
  15. #include <string.h>
  16.  
  17. #define        KEY001    (9371L)
  18. #define        INVALID    (-987L)
  19.  
  20. /* prototypes */
  21. long mixup(long x, long y );
  22. long f1(long inval);
  23. long lookup( long     stime, long durat);
  24. void interleave(long    tblidx, long cval , long *t8c5, long *t2c1);
  25. long map_top(long day, long year, long top, long digits );
  26. void offset( long day, long year, long top, long *ofout, long *topout );
  27. void Syntax(const char * message);
  28.  
  29.  
  30. int main( int argc, char *argv[] )
  31. {
  32.     long     j, doneflag, trailers, tblidx ;
  33.     long     s1_out, bot3, top5, quo, rem, newspaper ;
  34.     long     s4_out, s5_out, ofout, cval ;
  35.     long     month, day, year, channel, starttime, duration ;
  36.  
  37.    printf("Encode Version 1.1  by David W. Sanderson, Mark K. Mathews\n\n");
  38.  
  39.  
  40.     if(argc != 7 )  /* only 7 paramaters needed */
  41.        Syntax("Required paramaters missing");
  42.  
  43.    if (!strcmp(argv[1],"/?"))
  44.        Syntax("");
  45.  
  46.  
  47.     month = atoi(argv[1]);
  48.     day = atoi(argv[2]);
  49.     year = atoi(argv[3]);
  50.     channel = atoi(argv[4]);
  51.     starttime = atoi(argv[5]);
  52.     duration = atoi(argv[6]);
  53.  
  54.     year = year % 100 ;
  55.  
  56.     if( (month>12) || (month<1) || (day<1) || (day>31) )
  57.     {
  58.       Syntax("Invalid date");
  59.    }
  60.  
  61.  
  62.     if( (channel<1) || (channel>48) )
  63.     {
  64.       Syntax("Invalid channel number");
  65.    }
  66.  
  67.     trailers = starttime % 100;
  68.  
  69.     if( ((trailers != 0) && (trailers != 30))  ||
  70.         (starttime < 0) || (starttime > 2330))
  71.     {
  72.       Syntax("Invalid start time");
  73.    }
  74.  
  75.     trailers = duration % 30;
  76.     if( (trailers!=0) || (duration<30) || (duration>300) )
  77.     {
  78.       Syntax("Invalid program length");
  79.    }
  80.  
  81.  
  82.     /* get the  t  bits and the  c  bits */
  83.     cval = channel - 1 ;
  84.     tblidx = lookup(starttime, duration);
  85.  
  86.     /* from them infer what must have been step 4 & step 5 results */
  87.     interleave(tblidx, cval, (&s4_out), (&s5_out)) ;
  88.  
  89.     /* find the smallest unmapped_top giving correct mapped_top */
  90.     top5 = 0;
  91.     doneflag = 0;
  92.  
  93.     /* if the mapped_top is zero then top and offset are zero */
  94.     if(s4_out == 0)
  95.    {
  96.       top5 = 0; ofout = 0; doneflag = 1;
  97.    }
  98.  
  99.     while(doneflag == 0)
  100.     {
  101.         top5++;
  102.         offset(day, year, top5, (&ofout), (&j)) ;
  103.         if(j == s4_out)
  104.          doneflag = 1;
  105.     }
  106.  
  107.     /* have two of the three inputs to step 5; determine the rem */
  108.     for(rem=0; rem<32; rem++)
  109.     {
  110.         j = (rem + (day*(month+1)) + ofout) % 32 ;
  111.         if(j == s5_out)
  112.          break ;
  113.     }
  114.     quo = (day - 1);
  115.  
  116.  
  117.     /* assemble the output of step 1 */
  118.     bot3 = 1 + rem + (32 * quo) ;
  119.     s1_out = bot3 + (1000 * top5) ;
  120.  
  121.     /* invert the mixing */
  122.     newspaper = f1(s1_out);
  123.  
  124.     printf("Date (month/day/year) = %2ld/%2ld/%2ld\n"
  125.           "Magazine Channel      = %2ld\n"
  126.           "Start_time            = %4ld\n"
  127.            "Length                = %3ld\n"
  128.           "VCR-Plus code         = %6ld\n",
  129.           month, day, year, channel, starttime, duration, newspaper);
  130.     return(0);
  131. }
  132.  
  133.  
  134.  
  135. /* function that performs initial scrambling */
  136. long     mixup(long     x, long y )
  137. {
  138.  
  139.     long     j, k, sum;
  140.    int i;
  141.  
  142.     long     a[12], b[12], out[12] ;
  143.  
  144.     /* get the digits of x into a[] */
  145.     j = x ;
  146.     for(i=0; i<9; i++)
  147.     {
  148.         k = j % 10;
  149.         a[i] = k;
  150.         j = (j - k) / 10 ;
  151.     }
  152.  
  153.     /* get the digits of y into b[] */
  154.     j = y ;
  155.     for(i=0; i<9; i++)
  156.     {
  157.         k = j % 10;
  158.         b[i] = k;
  159.         j = (j - k) / 10 ;
  160.         out[i] = 0;
  161.     }
  162.  
  163.  
  164.     for(i=0; i<=8; i++)
  165.     {
  166.         for(j=0; j<=8; j++)
  167.         {
  168.             out[i+(int)j] += (b[(int)j] * a[(int)i]) ;
  169.         }
  170.     }
  171.  
  172.     j = 1;
  173.     sum = 0;
  174.     for(i=0; i<=8; i++)
  175.     {
  176.         sum += j * (out[i] % 10);
  177.         j = j * 10 ;
  178.     }
  179.     return( sum ) ;
  180. }
  181.  
  182.  
  183.  
  184. /* first function */
  185. long     f1(long     inval)
  186. {
  187.     long     ndigits, hashval ;
  188.     long     pwr ;
  189.  
  190.  
  191.     ndigits = 0;
  192.     pwr = 1;
  193.     while(inval >= pwr)
  194.    {
  195.       ndigits++;
  196.       pwr *= 10;
  197.    }
  198.     if(ndigits > 8)
  199.       printf("\nPANIC: %ld has %ld digits\n", inval, ndigits);
  200.  
  201.     pwr = pwr / 10 ;
  202.  
  203.     hashval = inval;
  204.  
  205. again:    hashval = mixup(hashval, KEY001) % (pwr * 10) ;
  206.     if(hashval < pwr)
  207.       goto again ;
  208.  
  209.     return(hashval);
  210. }
  211.  
  212.  
  213.  
  214.  
  215. /* the 512-entry tables of starting time and pgm duration */
  216. long     lookup(    long     stime, long durat)
  217. {
  218.     static    long     start[480], leng[480] ;
  219.     static    long     initializer = 0;
  220.  
  221.     long     s;
  222.    int j;
  223.  
  224.     if(initializer == 0)
  225.    {
  226.        initializer = 1;
  227.  
  228.        for(j=0; j<512; j++)
  229.       {
  230.          start[j] = leng[j] = INVALID;
  231.       }
  232.  
  233.        leng[0]   =  30 ;
  234.        leng[100] = 120 ;
  235.        leng[101] =  90 ;
  236.        leng[102] = 120 ;
  237.        leng[103] = 120 ;
  238.        leng[104] =  90 ;
  239.        leng[105] =  90 ;
  240.        leng[106] =  30 ;
  241.        leng[107] =  30 ;
  242.        leng[108] = 120 ;
  243.        leng[109] =  90 ;
  244.        leng[10]  =  30 ;
  245.        leng[110] =  90 ;
  246.        leng[111] =  30 ;
  247.        leng[112] =  90 ;
  248.        leng[113] =  30 ;
  249.        leng[114] =  30 ;
  250.        leng[115] = 120 ;
  251.        leng[116] =  30 ;
  252.        leng[117] = 120 ;
  253.        leng[118] = 120 ;
  254.        leng[119] =  30 ;
  255.        leng[11]  =  30 ;
  256.        leng[120] =  90 ;
  257.        leng[121] =  60 ;
  258.        leng[122] =  60 ;
  259.        leng[123] =  60 ;
  260.        leng[124] = 120 ;
  261.        leng[125] =  90 ;
  262.        leng[126] =  60 ;
  263.        leng[127] =  60 ;
  264.        leng[128] =  90 ;
  265.        leng[129] = 120 ;
  266.        leng[12]  =  30 ;
  267.        leng[130] = 120 ;
  268.        leng[131] =  90 ;
  269.        leng[132] =  60 ;
  270.        leng[133] =  60 ;
  271.        leng[134] = 120 ;
  272.        leng[135] =  90 ;
  273.        leng[136] =  90 ;
  274.        leng[137] = 120 ;
  275.        leng[138] = 120 ;
  276.        leng[139] =  60 ;
  277.        leng[13]  = 120 ;
  278.        leng[140] =  60 ;
  279.        leng[141] =  90 ;
  280.        leng[142] =  90 ;
  281.        leng[143] = 120 ;
  282.        leng[144] =  90 ;
  283.        leng[145] = 120 ;
  284.        leng[146] =  90 ;
  285.        leng[147] = 120 ;
  286.        leng[148] = 120 ;
  287.        leng[149] =  90 ;
  288.        leng[14]  =  30 ;
  289.        leng[150] = 120 ;
  290.        leng[151] =  90 ;
  291.        leng[152] =  90 ;
  292.        leng[153] =  90 ;
  293.        leng[154] =  60 ;
  294.        leng[155] =  60 ;
  295.        leng[156] = 120 ;
  296.        leng[157] =  60 ;
  297.        leng[158] =  60 ;
  298.        leng[159] =  60 ;
  299.        leng[15]  =  30 ;
  300.        leng[160] = 120 ;
  301.        leng[161] =  60 ;
  302.        leng[162] =  90 ;
  303.        leng[163] =  90 ;
  304.        leng[164] =  60 ;
  305.        leng[165] =  90 ;
  306.        leng[166] =  90 ;
  307.        leng[167] =  60 ;
  308.        leng[168] =  90 ;
  309.        leng[169] = 120 ;
  310.        leng[16]  = 120 ;
  311.        leng[170] =  60 ;
  312.        leng[171] = 120 ;
  313.        leng[172] =  60 ;
  314.        leng[173] =  60 ;
  315.        leng[174] = 120 ;
  316.        leng[175] =  90 ;
  317.        leng[176] =  60 ;
  318.        leng[177] = 120 ;
  319.        leng[178] =  60 ;
  320.        leng[179] =  60 ;
  321.        leng[17]  = 120 ;
  322.        leng[180] =  60 ;
  323.        leng[181] =  90 ;
  324.        leng[182] =  60 ;
  325.        leng[183] = 120 ;
  326.        leng[184] =  60 ;
  327.        leng[185] =  60 ;
  328.        leng[186] =  90 ;
  329.        leng[187] =  60 ;
  330.        leng[188] =  90 ;
  331.        leng[189] = 120 ;
  332.        leng[18]  =  60 ;
  333.        leng[190] =  90 ;
  334.        leng[191] =  90 ;
  335.        leng[19]  = 120 ;
  336.        leng[1]   =  30 ;
  337.        leng[20]  =  60 ;
  338.        leng[21]  =  60 ;
  339.        leng[22]  =  60 ;
  340.        leng[23]  = 120 ;
  341.        leng[24]  =  60 ;
  342.        leng[25]  = 120 ;
  343.        leng[26]  =  30 ;
  344.        leng[27]  =  30 ;
  345.        leng[28]  =  30 ;
  346.        leng[29]  =  60 ;
  347.        leng[2]   =  30 ;
  348.        leng[30]  =  90 ;
  349.        leng[31]  =  30 ;
  350.        leng[32]  =  30 ;
  351.        leng[33]  =  30 ;
  352.        leng[34]  =  30 ;
  353.        leng[35]  =  60 ;
  354.        leng[36]  =  30 ;
  355.        leng[37]  =  60 ;
  356.        leng[38]  = 120 ;
  357.        leng[39]  =  60 ;
  358.        leng[3]   =  30 ;
  359.        leng[40]  =  30 ;
  360.        leng[41]  =  30 ;
  361.        leng[42]  =  30 ;
  362.        leng[43]  =  30 ;
  363.        leng[44]  = 120 ;
  364.        leng[45]  =  30 ;
  365.        leng[46]  =  30 ;
  366.        leng[47]  =  30 ;
  367.        leng[48]  = 120 ;
  368.        leng[49]  =  30 ;
  369.        leng[4]   =  30 ;
  370.        leng[50]  =  60 ;
  371.        leng[51]  =  60 ;
  372.        leng[52]  =  30 ;
  373.        leng[53]  =  30 ;
  374.        leng[54]  = 120 ;
  375.        leng[55]  =  60 ;
  376.        leng[56]  =  60 ;
  377.        leng[57]  =  30 ;
  378.        leng[58]  = 120 ;
  379.        leng[59]  =  30 ;
  380.        leng[5]   =  30 ;
  381.        leng[60]  = 120 ;
  382.        leng[61]  = 120 ;
  383.        leng[62]  = 120 ;
  384.        leng[63]  =  30 ;
  385.        leng[64]  =  90 ;
  386.        leng[65]  =  30 ;
  387.        leng[66]  =  30 ;
  388.        leng[67]  =  30 ;
  389.        leng[68]  = 120 ;
  390.        leng[69]  =  90 ;
  391.        leng[6]   =  30 ;
  392.        leng[70]  =  90 ;
  393.        leng[71]  =  60 ;
  394.        leng[72]  =  90 ;
  395.        leng[73]  =  90 ;
  396.        leng[74]  =  90 ;
  397.        leng[75]  =  90 ;
  398.        leng[76]  =  90 ;
  399.        leng[77]  =  60 ;
  400.        leng[78]  =  90 ;
  401.        leng[79]  =  30 ;
  402.        leng[7]   =  30 ;
  403.        leng[80]  = 120 ;
  404.        leng[81]  =  60 ;
  405.        leng[82]  =  90 ;
  406.        leng[83]  = 120 ;
  407.        leng[84]  =  60 ;
  408.        leng[85]  =  60 ;
  409.        leng[86]  = 120 ;
  410.        leng[87]  =  30 ;
  411.        leng[88]  =  90 ;
  412.        leng[89]  = 120 ;
  413.        leng[8]   =  30 ;
  414.        leng[90]  = 120 ;
  415.        leng[91]  =  90 ;
  416.        leng[92]  =  90 ;
  417.        leng[93]  =  90 ;
  418.        leng[94]  =  90 ;
  419.        leng[95]  = 120 ;
  420.        leng[96]  =  60 ;
  421.        leng[97]  = 120 ;
  422.        leng[98]  =  90 ;
  423.        leng[99]  =  30 ;
  424.        leng[9]   =  60 ;
  425.        start[0]   = 1830 ;
  426.        start[100] =  330 ;
  427.        start[101] = 1500 ;
  428.        start[102] = 1500 ;
  429.        start[103] = 2300 ;
  430.        start[104] = 1900 ;
  431.        start[105] =  800 ;
  432.        start[106] =  430 ;
  433.        start[107] =  300 ;
  434.        start[108] = 1330 ;
  435.        start[109] = 1000 ;
  436.        start[10]  = 1400 ;
  437.        start[110] =  700 ;
  438.        start[111] =  100 ;
  439.        start[112] = 2330 ;
  440.        start[113] =  330 ;
  441.        start[114] =  200 ;
  442.        start[115] = 2230 ;
  443.        start[116] =  400 ;
  444.        start[117] =  600 ;
  445.        start[118] =  400 ;
  446.        start[119] =  230 ;
  447.        start[11]  = 2030 ;
  448.        start[120] =  630 ;
  449.        start[121] =   30 ;
  450.        start[122] = 2230 ;
  451.        start[123] =  100 ;
  452.        start[124] =   30 ;
  453.        start[125] = 2300 ;
  454.        start[126] = 1630 ;
  455.        start[127] =  830 ;
  456.        start[128] =    0 ;
  457.        start[129] = 1930 ;
  458.        start[12]  = 1700 ;
  459.        start[130] =  930 ;
  460.        start[131] = 2030 ;
  461.        start[132] =  500 ;
  462.        start[133] = 1730 ;
  463.        start[134] =  200 ;
  464.        start[135] = 1930 ;
  465.        start[136] =  930 ;
  466.        start[137] = 1730 ;
  467.        start[138] =  630 ;
  468.        start[139] = 1830 ;
  469.        start[13]  = 1600 ;
  470.        start[140] = 1430 ;
  471.        start[141] = 1130 ;
  472.        start[142] =   30 ;
  473.        start[143] =  830 ;
  474.        start[144] = 1030 ;
  475.        start[145] = 1430 ;
  476.        start[146] =  100 ;
  477.        start[147] =  730 ;
  478.        start[148] = 2030 ;
  479.        start[149] =  300 ;
  480.        start[14]  = 2000 ;
  481.        start[150] =  300 ;
  482.        start[151] = 1330 ;
  483.        start[152] = 1230 ;
  484.        start[153] =  230 ;
  485.        start[154] = 2130 ;
  486.        start[155] = 1130 ;
  487.        start[156] = 1830 ;
  488.        start[157] =  630 ;
  489.        start[158] =  530 ;
  490.        start[159] =  200 ;
  491.        start[15]  = 1500 ;
  492.        start[160] = 1530 ;
  493.        start[161] =  730 ;
  494.        start[162] =  600 ;
  495.        start[163] = 1730 ;
  496.        start[164] =  400 ;
  497.        start[165] =  730 ;
  498.        start[166] =  430 ;
  499.        start[167] =  430 ;
  500.        start[168] =  130 ;
  501.        start[169] = 1230 ;
  502.        start[16]  = 2000 ;
  503.        start[170] =  130 ;
  504.        start[171] =  230 ;
  505.        start[172] = 1930 ;
  506.        start[173] =  300 ;
  507.        start[174] = 1030 ;
  508.        start[175] =  200 ;
  509.        start[176] =  330 ;
  510.        start[177] =  500 ;
  511.        start[178] =  930 ;
  512.        start[179] =  230 ;
  513.        start[17]  = 2100 ;
  514.        start[180] = 2030 ;
  515.        start[181] =  400 ;
  516.        start[182] = 1530 ;
  517.        start[183] =  430 ;
  518.        start[184] = 1330 ;
  519.        start[185] = 1230 ;
  520.        start[186] =  330 ;
  521.        start[187] = 1030 ;
  522.        start[188] =  500 ;
  523.        start[189] =  530 ;
  524.        start[18]  = 2000 ;
  525.        start[190] =  530 ;
  526.        start[191] = 1100 ;
  527.        start[19]  = 1800 ;
  528.        start[1]   = 1600 ;
  529.        start[20]  = 1900 ;
  530.        start[21]  = 2200 ;
  531.        start[22]  = 2100 ;
  532.        start[23]  = 1400 ;
  533.        start[24]  = 1500 ;
  534.        start[25]  = 2200 ;
  535.        start[26]  = 1130 ;
  536.        start[27]  = 1100 ;
  537.        start[28]  = 2300 ;
  538.        start[29]  = 1600 ;
  539.        start[2]   = 1930 ;
  540.        start[30]  = 2100 ;
  541.        start[31]  = 2100 ;
  542.        start[32]  = 1230 ;
  543.        start[33]  = 1330 ;
  544.        start[34]  =  930 ;
  545.        start[35]  = 1300 ;
  546.        start[36]  = 2130 ;
  547.        start[37]  = 1200 ;
  548.        start[38]  = 1000 ;
  549.        start[39]  = 1800 ;
  550.        start[3]   = 1630 ;
  551.        start[40]  = 2200 ;
  552.        start[41]  = 1200 ;
  553.        start[42]  =  800 ;
  554.        start[43]  =  830 ;
  555.        start[44]  = 1700 ;
  556.        start[45]  =  900 ;
  557.        start[46]  = 2230 ;
  558.        start[47]  = 1030 ;
  559.        start[48]  = 1900 ;
  560.        start[49]  =  730 ;
  561.        start[4]   = 1530 ;
  562.        start[50]  = 2300 ;
  563.        start[51]  = 1000 ;
  564.        start[52]  =  700 ;
  565.        start[53]  = 1300 ;
  566.        start[54]  =  700 ;
  567.        start[55]  = 1100 ;
  568.        start[56]  = 1400 ;
  569.        start[57]  = 1000 ;
  570.        start[58]  =  800 ;
  571.        start[59]  = 2330 ;
  572.        start[5]   = 1730 ;
  573.        start[60]  = 1300 ;
  574.        start[61]  = 1200 ;
  575.        start[62]  =  900 ;
  576.        start[63]  =  630 ;
  577.        start[64]  = 1800 ;
  578.        start[65]  =  600 ;
  579.        start[66]  =  530 ;
  580.        start[67]  =    0 ;
  581.        start[68]  = 2330 ;
  582.        start[69]  = 2200 ;
  583.        start[6]   = 1800 ;
  584.        start[70]  = 1300 ;
  585.        start[71]  =  900 ;
  586.        start[72]  = 1630 ;
  587.        start[73]  = 1600 ;
  588.        start[74]  = 1430 ;
  589.        start[75]  = 2000 ;
  590.        start[76]  = 1830 ;
  591.        start[77]  =  600 ;
  592.        start[78]  = 1200 ;
  593.        start[79]  =   30 ;
  594.        start[7]   = 1430 ;
  595.        start[80]  =  130 ;
  596.        start[81]  =    0 ;
  597.        start[82]  = 1700 ;
  598.        start[83]  =    0 ;
  599.        start[84]  =  800 ;
  600.        start[85]  =  700 ;
  601.        start[86]  = 2130 ;
  602.        start[87]  =  500 ;
  603.        start[88]  = 1530 ;
  604.        start[89]  = 1130 ;
  605.        start[8]   = 1900 ;
  606.        start[90]  = 1100 ;
  607.        start[91]  =  830 ;
  608.        start[92]  = 2230 ;
  609.        start[93]  =  900 ;
  610.        start[94]  = 2130 ;
  611.        start[95]  = 1630 ;
  612.        start[96]  = 2330 ;
  613.        start[97]  =  100 ;
  614.        start[98]  = 1400 ;
  615.        start[99]  =  130 ;
  616.        start[9]   = 1700 ;
  617.  
  618.  
  619.        s = 2330;
  620.       for(j=192; j<240; j++)
  621.        {
  622.          start[j] = s;
  623.          leng[j] = 150;
  624.          if(0==(j%2))
  625.             s-=30;
  626.          else
  627.             s-=70;
  628.       }
  629.  
  630.        s = 2330;
  631.        for(j=240; j<288; j++)
  632.        {
  633.          start[j] = s;
  634.          leng[j] = 180;
  635.          if(0==(j%2))
  636.             s-=30;
  637.          else
  638.             s-=70;
  639.       }
  640.  
  641.        s = 2330;
  642.        for(j=288; j<336; j++)
  643.        {
  644.          start[j] = s;
  645.          leng[j] = 210;
  646.          if(0==(j%2))
  647.             s-=30;
  648.          else
  649.             s-=70;
  650.       }
  651.  
  652.        s = 2330;
  653.        for(j=336; j<384; j++)
  654.        {
  655.          start[j] = s;
  656.          leng[j] = 240;
  657.          if(0==(j%2))
  658.             s-=30;
  659.          else
  660.             s-=70;
  661.       }
  662.  
  663.        s = 2330;
  664.        for(j=384; j<432; j++)
  665.        {
  666.          start[j] = s;
  667.          leng[j] = 270;
  668.          if(0==(j%2))
  669.            s-=30;
  670.          else
  671.            s-=70;
  672.       }
  673.  
  674.        s = 2330;
  675.        for(j=432; j<480; j++)
  676.        {
  677.          start[j] = s;
  678.          leng[j] = 300;
  679.          if(0==(j%2))
  680.             s-=30;
  681.          else
  682.             s-=70;
  683.       }
  684.  
  685.    } /* end of initializer block */
  686.  
  687.  
  688.     for(j=0; j<481; j++)
  689.     {
  690.         if(stime == start[j])
  691.       {
  692.            if(durat == leng[j])
  693.             break ;
  694.         }
  695.     }
  696.  
  697.     if( j >= 480 )
  698.     {
  699.         printf("oops, I dont have an entry for index %ld\n", j);
  700.         fflush(stdout);
  701.         j = 0;
  702.     }
  703.  
  704.     return(j);
  705. }
  706.  
  707.  
  708.  
  709.  
  710.  
  711.  
  712. void    interleave(long    tblidx, long cval , long *t8c5, long *t2c1)
  713. {
  714.     long     small, big, b;
  715.  
  716.     small = 0;
  717.     big = 0;
  718.  
  719.     /* build t2c1 */
  720.     b = 0x00000001 & (tblidx >> 2) ;
  721.     small += (b << 4);
  722.  
  723.     b = 0x00000001 & (tblidx >> 1) ;
  724.     small += (b << 2);
  725.  
  726.     b = 0x00000001 & tblidx ;
  727.     small += b;
  728.  
  729.     b = 0x00000001 & (cval >> 1) ;
  730.     small += (b << 3);
  731.  
  732.     b = 0x00000001 & cval ;
  733.     small += (b << 1);
  734.  
  735.  
  736.     /* build t8c5 */
  737.     b = 0x00000001 & (tblidx >> 8) ;
  738.     big += (b << 9);
  739.  
  740.     b = 0x00000001 & (tblidx >> 7) ;
  741.     big += (b << 7);
  742.  
  743.     b = 0x00000001 & (tblidx >> 6) ;
  744.     big += (b << 5);
  745.  
  746.     b = 0x00000001 & (tblidx >> 5) ;
  747.     big += (b << 4);
  748.  
  749.     b = 0x00000001 & (tblidx >> 4) ;
  750.     big += (b << 3);
  751.  
  752.     b = 0x00000001 & (tblidx >> 3) ;
  753.     big += b;
  754.  
  755.     b = 0x00000001 & (cval >> 5) ;
  756.     big += (b << 8);
  757.  
  758.     b = 0x00000001 & (cval >> 4) ;
  759.     big += (b << 6);
  760.  
  761.     b = 0x00000001 & (cval >> 3) ;
  762.     big += (b << 2);
  763.  
  764.     b = 0x00000001 & (cval >> 2) ;
  765.     big += (b << 1);
  766.  
  767.  
  768.     *t8c5 = big;
  769.     *t2c1 = small;
  770. }
  771.  
  772.  
  773.  
  774.  
  775.  
  776. long    map_top(long day, long year, long top, long digits )
  777. {
  778.     long     d2, d1, d0, y, poot ;
  779.     long     n2, n1, n0, f3, f2, f1, f0;
  780.  
  781.     y = year % 16 ;
  782.     d2 = top / 100 ;
  783.     d1 = (top % 100) / 10 ;
  784.     d0 = top % 10 ;
  785.  
  786.     f0 = 1;
  787.     f1 = (y + 1) % 10;
  788.     f2 = ( ((y+1)*(y+2)) / 2 ) % 10 ;
  789.     f3 = ( ((y+1)*(y+2)*(y+3)) / 6 ) % 10 ;
  790.  
  791.  
  792.     if(digits == 1)
  793.     {
  794.         n0 = ( (d0*f0) + (day*f1) ) % 10 ;
  795.         n1 = 0;
  796.         n2 = 0;
  797.     }
  798.  
  799.     if(digits == 2)
  800.     {
  801.         n0 = ( (d0*f0) + (d1*f1) + (day*f2) ) % 10 ;
  802.         n1 = ( (d1*f0) + (day*f1) ) % 10 ;
  803.         n2 = 0;
  804.     }
  805.  
  806.     if(digits == 3)
  807.     {
  808.         n0 = ( (d0*f0) + (d1*f1) + (d2*f2) + (day*f3) ) % 10 ;
  809.         n1 = ( (d1*f0) + (d2*f1) + (day*f2) ) % 10 ;
  810.         n2 = ( (d2*f0) + (day*f1) ) % 10 ;
  811.     }
  812.  
  813.  
  814.     poot =  (100*n2) + (10*n1) + n0 ;
  815.  
  816.     return( poot );
  817. }
  818.  
  819.  
  820.  
  821.  
  822.  
  823. void    offset(    long day, long year, long top, long *ofout, long *topout )
  824. {
  825.     long     i, t, tx, off, digits, burp;
  826.     long     pwr ;
  827.  
  828.  
  829.     pwr = 1 ; digits = 0;
  830.     while(top >= pwr)
  831.    {
  832.       digits++;
  833.       pwr *= 10;
  834.    }
  835.     pwr = pwr / 10 ;
  836.  
  837.     t = tx = top ;
  838.     off = 0;
  839.     while(tx > 0)
  840.    {
  841.       off += (tx % 10);
  842.       tx /= 10;
  843.    }
  844.  
  845. again:
  846.     for(i=0; i<=(year%16); i++)
  847.     {
  848.         burp = ( (map_top(day, i, t, digits)) % 10 ) ;
  849.         off += burp ;
  850.     }
  851.  
  852.     t = map_top(day, year, t, digits) ;
  853.  
  854.     if(t < pwr)
  855.       goto again ;
  856.  
  857.  
  858.     *ofout = (off % 32) ;
  859.     *topout = (t) ;
  860. }
  861.  
  862.  
  863. void Syntax(const char *message)
  864. {
  865.    if ( *message != NULL)
  866.    {
  867.       printf(message);
  868.       printf("\n\n");
  869.    }
  870.  
  871.    printf("Encode V1.1 Converts program time to VCR-Plus code.\n"
  872.           "\n"
  873.           "Encode [MM] [DD] [YY] [CH] [START] [LENGTH]\n"
  874.           "\n"
  875.           "   [MM]     - Month of program.\n"
  876.           "   [DD]     - Day of program.\n"
  877.           "   [YY]     - Year of program.\n"
  878.           "   [CH]     - Channel # from magazine.\n"
  879.           "   [START]  - Time program starts.\n"
  880.           "              Example:\n"
  881.           "                 If 9AM enter 900.\n"
  882.           "                 If 6AM enter 1800 (600+1200).\n"
  883.           "   [LENGTH] - How long the program is.\n"
  884.           "   /?       - This help info.\n"
  885.          );
  886.     exit(-1) ;
  887.  
  888. }
  889.  
  890.  
  891.  
  892.  
  893.  
  894.  
  895.  
  896.  
  897.  
  898.  
  899.