home *** CD-ROM | disk | FTP | other *** search
/ NetNews Usenet Archive 1992 #31 / NN_1992_31.iso / spool / rec / video / 15265 < prev    next >
Encoding:
Text File  |  1992-12-31  |  34.5 KB  |  1,692 lines

  1. Xref: sparky rec.video:15265 alt.sources:2905
  2. Newsgroups: rec.video,alt.sources
  3. Path: sparky!uunet!zaphod.mps.ohio-state.edu!uwm.edu!daffy!uwvax!ssec.wisc.edu!dws
  4. From: dws@ssec.wisc.edu (DaviD W. Sanderson)
  5. Subject: Re: HERE IS VCR Plus source code
  6. Message-ID: <1992Dec31.180816.7396@cs.wisc.edu>
  7. Sender: news@cs.wisc.edu (The News)
  8. Organization: UW-Madison Space Science and Engineering Center
  9. References: <9212311600.AA03824@procyon.cis.ksu.edu> <1992Dec31.170245.6522@eecs.nwu.edu>
  10. Date: Thu, 31 Dec 1992 18:08:16 GMT
  11. Lines: 1679
  12.  
  13. In article <1992Dec31.170245.6522@eecs.nwu.edu> kaufman@eecs.nwu.edu (Michael L. Kaufman) writes:
  14. >This file would not decode on my machine.
  15.  
  16. I had problems with it too.  I had to fix up the uuencoded text
  17. manually, since the trailing spaces got deleted somewhere along the
  18. way.  Even then, uudecode claimed 'short file', but I was able to
  19. unpack the resulting .zip file without problems.
  20.  
  21. >Mail to the poster bounced, so if he (or anyone else)
  22. >could try reposting, or better yet, just post the source, I
  23. >would appreciate it. I am sure that others would too.
  24.  
  25. Okay, here's a shar of the contents of the .zip file.  Note that I
  26. am NOT the author and I have not been able to contact him by Email
  27. either.
  28.  
  29. DaviD W. Sanderson (dws@ssec.wisc.edu)
  30.  
  31.     "The Noah Webster of smileys is David Sanderson"
  32.         - The Wall Street Journal, 15 Sep 1992
  33.  
  34. #!/bin/sh
  35. # This is a shell archive (produced by shar 3.49)
  36. # To extract the files from this archive, save it to a file, remove
  37. # everything above the "!/bin/sh" line above, and type "sh file_name".
  38. #
  39. # made 12/31/1992 18:00 UTC by dws@ssec
  40. # Source directory /home/dws/vcrplus
  41. #
  42. # existing files will NOT be overwritten unless -c is specified
  43. #
  44. # This shar contains:
  45. # length  mode       name
  46. # ------ ---------- ------------------------------------------
  47. #   2641 -r-------- readme.txt
  48. #  13721 -r-------- decode.c
  49. #  14248 -r-------- encode.c
  50. #
  51. # ============= readme.txt ==============
  52. if test -f 'readme.txt' -a X"$1" != X"-c"; then
  53.     echo 'x - skipping readme.txt (File already exists)'
  54. else
  55. echo 'x - extracting readme.txt (Text)'
  56. sed 's/^X//' << 'SHAR_EOF' > 'readme.txt' &&
  57. This ZIP archive holds three files
  58. X      readme.txt
  59. X      encode.c
  60. X      decode.c
  61. X
  62. X
  63. decode.c is source program that reads a VCRPLUS code
  64. number value you find in the newspaper and calculates
  65. X    date_of_the_tv_program
  66. X    starting_time_of_the_tv_program
  67. X    run_length_of_the_tv_program
  68. X
  69. X
  70. encode.c is source program that reads a date, start time,
  71. and run length then turns them into a VCRPLUS code number
  72. like the ones in the newspaper.
  73. X
  74. X
  75. X
  76. There are a few weak spots in these programs.
  77. X
  78. X    1.  They only work for the usual kinds of tv shows,
  79. X           a.  Must start on an even half-hour or hour
  80. X           b.  Must end on an even half-hour or hour
  81. X
  82. X    2.  They only handle VCRPLUS code values that are 1-6 digits
  83. X           long (these are the ones that start and end on
  84. X           half-hour or hour boundaries)
  85. X
  86. X    3.  Both programs ask for today's date.  They should
  87. X           instead get this from the computer itself but that is
  88. X           too much involved with O/S details.
  89. X
  90. X    4.  Integers are used everywhere, even for time_of_day.
  91. X           a.  You need to use a 32-bit computer
  92. X           b.  So, nine o clock at night, comes out 2100
  93. X
  94. X    5.  The VCRPLUS hardware uses "channel mapping" for
  95. X           channel numbers above 19, and for cable tv stations.
  96. X           Just decode some VCRPLUS code numbers from each unusual
  97. X           channel and get the "mapped channel" numbers.  For
  98. X           example in this area the VCRPLUS people have
  99. X           mapped cable station ESPN to "channel 22".
  100. X
  101. X
  102. X
  103. X
  104. X
  105. Example 1:  encode    nebraska  deleware  newyork
  106. X                 This is a (deliberate) error.  You should
  107. X                 get back a message telling how to do it right:
  108. X            Usage: encode  month  day  year  channel  starting_time  length_in_minutes
  109. X
  110. X
  111. X
  112. Example 2:  decode    newyork  nebraska  deleware
  113. X            Usage: decode  todays_month  todays_day  todays_year   Code_value_in_newspaper
  114. X
  115. X
  116. X
  117. Example 3:  encode 1 4 93 5 900 30
  118. X                 You have asked for the VCRPLUS code of a tv show
  119. X                 on January 4th of 1993, channel number 5, at 9 o clock
  120. X                 (in the morning), that lasts for 30 minutes.
  121. X                 The program answers back:
  122. X                  1   4  93   5  900    30    VCRPLUS_CODE=    19297
  123. X
  124. X
  125. Example 4:  decode 1 2 93 19297
  126. X                 On January 2nd of 1993 you have asked a question.  You
  127. X                 want to know "what show does the VCRPLUS code 19297
  128. X                 represent?"  The program answers back
  129. X                 Code=  19297     1   4  93   Mapped_channel=  5  Start_time= 0900  Length=  30
  130. X
  131. X
  132. X
  133. X
  134. X
  135. Have some fun with this stuff.
  136. X
  137. Otis.
  138. SHAR_EOF
  139. chmod 0400 readme.txt ||
  140. echo 'restore of readme.txt failed'
  141. Wc_c="`wc -c < 'readme.txt'`"
  142. test 2641 -eq "$Wc_c" ||
  143.     echo 'readme.txt: original size 2641, current size' "$Wc_c"
  144. fi
  145. # ============= decode.c ==============
  146. if test -f 'decode.c' -a X"$1" != X"-c"; then
  147.     echo 'x - skipping decode.c (File already exists)'
  148. else
  149. echo 'x - extracting decode.c (Text)'
  150. sed 's/^X//' << 'SHAR_EOF' > 'decode.c' &&
  151. #include <stdio.h>
  152. X
  153. #define        KEY001    (68150631)
  154. #define        INVALID    (-987)
  155. X
  156. X
  157. /* function that performs initial scrambling */
  158. int    mixup(x, y)
  159. X    int    x, y;
  160. {
  161. X    int    i, j, k, sum;
  162. X
  163. X    int    a[12], b[12], out[12] ;
  164. X
  165. X    /* get the digits of x into a[] */
  166. X    j = x ;
  167. X    for(i=0; i<9; i++)
  168. X    {
  169. X        k = j % 10;
  170. X        a[i] = k;
  171. X        j = (j - k) / 10 ;
  172. X    }
  173. X
  174. X    /* get the digits of y into b[] */
  175. X    j = y ;
  176. X    for(i=0; i<9; i++)
  177. X    {
  178. X        k = j % 10;
  179. X        b[i] = k;
  180. X        j = (j - k) / 10 ;
  181. X        out[i] = 0;
  182. X    }
  183. X
  184. X
  185. X    for(i=0; i<=8; i++)
  186. X    {
  187. X        for(j=0; j<=8; j++)
  188. X        {
  189. X            out[i+j] += (b[j] * a[i]) ;
  190. X        }
  191. X    }
  192. X
  193. X    j = 1;
  194. X    sum = 0;
  195. X    for(i=0; i<=8; i++)
  196. X    {
  197. X        sum += j * (out[i] % 10);
  198. X        j = j * 10 ;
  199. X    }
  200. X    return( sum ) ;
  201. }
  202. X
  203. X
  204. X
  205. /* first function */
  206. int    f1(inval)
  207. X    int    inval ;
  208. {
  209. X    int    ndigits, hashval ;
  210. X    int    pwr ;
  211. X
  212. X
  213. X    ndigits = 0;
  214. X    pwr = 1;
  215. X    while(inval >= pwr) { ndigits++; pwr *= 10; }
  216. X    if(ndigits > 8) printf("\nPANIC: %d has %d digits\n", inval, ndigits);
  217. X    pwr = pwr / 10 ;
  218. X
  219. X    hashval = inval;
  220. again:    hashval = mixup(hashval, KEY001) % (pwr * 10) ;
  221. X    if(hashval < pwr) goto again ;
  222. X
  223. X    return(hashval);
  224. }
  225. X
  226. X
  227. X
  228. X
  229. /* the 512-entry tables of starting time and pgm duration */
  230. void    lookup(i, outtime, outdur)
  231. X    int    i, *outtime, *outdur ;
  232. {
  233. X    static    int    start[480], leng[480] ;
  234. X    static    int    initializer = 0;
  235. X
  236. X    int    j, s;
  237. X
  238. X    if(initializer == 0) {
  239. X    initializer = 1;
  240. X
  241. X    for(j=0; j<512; j++) { start[j] = leng[j] = INVALID; }
  242. X
  243. X    leng[0]   =  30 ;
  244. X    leng[100] = 120 ;
  245. X    leng[101] =  90 ;
  246. X    leng[102] = 120 ;
  247. X    leng[103] = 120 ;
  248. X    leng[104] =  90 ;
  249. X    leng[105] =  90 ;
  250. X    leng[106] =  30 ;
  251. X    leng[107] =  30 ;
  252. X    leng[108] = 120 ;
  253. X    leng[109] =  90 ;
  254. X    leng[10]  =  30 ;
  255. X    leng[110] =  90 ;
  256. X    leng[111] =  30 ;
  257. X    leng[112] =  90 ;
  258. X    leng[113] =  30 ;
  259. X    leng[114] =  30 ;
  260. X    leng[115] = 120 ;
  261. X    leng[116] =  30 ;
  262. X    leng[117] = 120 ;
  263. X    leng[118] = 120 ;
  264. X    leng[119] =  30 ;
  265. X    leng[11]  =  30 ;
  266. X    leng[120] =  90 ;
  267. X    leng[121] =  60 ;
  268. X    leng[122] =  60 ;
  269. X    leng[123] =  60 ;
  270. X    leng[124] = 120 ;
  271. X    leng[125] =  90 ;
  272. X    leng[126] =  60 ;
  273. X    leng[127] =  60 ;
  274. X    leng[128] =  90 ;
  275. X    leng[129] = 120 ;
  276. X    leng[12]  =  30 ;
  277. X    leng[130] = 120 ;
  278. X    leng[131] =  90 ;
  279. X    leng[132] =  60 ;
  280. X    leng[133] =  60 ;
  281. X    leng[134] = 120 ;
  282. X    leng[135] =  90 ;
  283. X    leng[136] =  90 ;
  284. X    leng[137] = 120 ;
  285. X    leng[138] = 120 ;
  286. X    leng[139] =  60 ;
  287. X    leng[13]  = 120 ;
  288. X    leng[140] =  60 ;
  289. X    leng[141] =  90 ;
  290. X    leng[142] =  90 ;
  291. X    leng[143] = 120 ;
  292. X    leng[144] =  90 ;
  293. X    leng[145] = 120 ;
  294. X    leng[146] =  90 ;
  295. X    leng[147] = 120 ;
  296. X    leng[148] = 120 ;
  297. X    leng[149] =  90 ;
  298. X    leng[14]  =  30 ;
  299. X    leng[150] = 120 ;
  300. X    leng[151] =  90 ;
  301. X    leng[152] =  90 ;
  302. X    leng[153] =  90 ;
  303. X    leng[154] =  60 ;
  304. X    leng[155] =  60 ;
  305. X    leng[156] = 120 ;
  306. X    leng[157] =  60 ;
  307. X    leng[158] =  60 ;
  308. X    leng[159] =  60 ;
  309. X    leng[15]  =  30 ;
  310. X    leng[160] = 120 ;
  311. X    leng[161] =  60 ;
  312. X    leng[162] =  90 ;
  313. X    leng[163] =  90 ;
  314. X    leng[164] =  60 ;
  315. X    leng[165] =  90 ;
  316. X    leng[166] =  90 ;
  317. X    leng[167] =  60 ;
  318. X    leng[168] =  90 ;
  319. X    leng[169] = 120 ;
  320. X    leng[16]  = 120 ;
  321. X    leng[170] =  60 ;
  322. X    leng[171] = 120 ;
  323. X    leng[172] =  60 ;
  324. X    leng[173] =  60 ;
  325. X    leng[174] = 120 ;
  326. X    leng[175] =  90 ;
  327. X    leng[176] =  60 ;
  328. X    leng[177] = 120 ;
  329. X    leng[178] =  60 ;
  330. X    leng[179] =  60 ;
  331. X    leng[17]  = 120 ;
  332. X    leng[180] =  60 ;
  333. X    leng[181] =  90 ;
  334. X    leng[182] =  60 ;
  335. X    leng[183] = 120 ;
  336. X    leng[184] =  60 ;
  337. X    leng[185] =  60 ;
  338. X    leng[186] =  90 ;
  339. X    leng[187] =  60 ;
  340. X    leng[188] =  90 ;
  341. X    leng[189] = 120 ;
  342. X    leng[18]  =  60 ;
  343. X    leng[190] =  90 ;
  344. X    leng[191] =  90 ;
  345. X    leng[19]  = 120 ;
  346. X    leng[1]   =  30 ;
  347. X    leng[20]  =  60 ;
  348. X    leng[21]  =  60 ;
  349. X    leng[22]  =  60 ;
  350. X    leng[23]  = 120 ;
  351. X    leng[24]  =  60 ;
  352. X    leng[25]  = 120 ;
  353. X    leng[26]  =  30 ;
  354. X    leng[27]  =  30 ;
  355. X    leng[28]  =  30 ;
  356. X    leng[29]  =  60 ;
  357. X    leng[2]   =  30 ;
  358. X    leng[30]  =  90 ;
  359. X    leng[31]  =  30 ;
  360. X    leng[32]  =  30 ;
  361. X    leng[33]  =  30 ;
  362. X    leng[34]  =  30 ;
  363. X    leng[35]  =  60 ;
  364. X    leng[36]  =  30 ;
  365. X    leng[37]  =  60 ;
  366. X    leng[38]  = 120 ;
  367. X    leng[39]  =  60 ;
  368. X    leng[3]   =  30 ;
  369. X    leng[40]  =  30 ;
  370. X    leng[41]  =  30 ;
  371. X    leng[42]  =  30 ;
  372. X    leng[43]  =  30 ;
  373. X    leng[44]  = 120 ;
  374. X    leng[45]  =  30 ;
  375. X    leng[46]  =  30 ;
  376. X    leng[47]  =  30 ;
  377. X    leng[48]  = 120 ;
  378. X    leng[49]  =  30 ;
  379. X    leng[4]   =  30 ;
  380. X    leng[50]  =  60 ;
  381. X    leng[51]  =  60 ;
  382. X    leng[52]  =  30 ;
  383. X    leng[53]  =  30 ;
  384. X    leng[54]  = 120 ;
  385. X    leng[55]  =  60 ;
  386. X    leng[56]  =  60 ;
  387. X    leng[57]  =  30 ;
  388. X    leng[58]  = 120 ;
  389. X    leng[59]  =  30 ;
  390. X    leng[5]   =  30 ;
  391. X    leng[60]  = 120 ;
  392. X    leng[61]  = 120 ;
  393. X    leng[62]  = 120 ;
  394. X    leng[63]  =  30 ;
  395. X    leng[64]  =  90 ;
  396. X    leng[65]  =  30 ;
  397. X    leng[66]  =  30 ;
  398. X    leng[67]  =  30 ;
  399. X    leng[68]  = 120 ;
  400. X    leng[69]  =  90 ;
  401. X    leng[6]   =  30 ;
  402. X    leng[70]  =  90 ;
  403. X    leng[71]  =  60 ;
  404. X    leng[72]  =  90 ;
  405. X    leng[73]  =  90 ;
  406. X    leng[74]  =  90 ;
  407. X    leng[75]  =  90 ;
  408. X    leng[76]  =  90 ;
  409. X    leng[77]  =  60 ;
  410. X    leng[78]  =  90 ;
  411. X    leng[79]  =  30 ;
  412. X    leng[7]   =  30 ;
  413. X    leng[80]  = 120 ;
  414. X    leng[81]  =  60 ;
  415. X    leng[82]  =  90 ;
  416. X    leng[83]  = 120 ;
  417. X    leng[84]  =  60 ;
  418. X    leng[85]  =  60 ;
  419. X    leng[86]  = 120 ;
  420. X    leng[87]  =  30 ;
  421. X    leng[88]  =  90 ;
  422. X    leng[89]  = 120 ;
  423. X    leng[8]   =  30 ;
  424. X    leng[90]  = 120 ;
  425. X    leng[91]  =  90 ;
  426. X    leng[92]  =  90 ;
  427. X    leng[93]  =  90 ;
  428. X    leng[94]  =  90 ;
  429. X    leng[95]  = 120 ;
  430. X    leng[96]  =  60 ;
  431. X    leng[97]  = 120 ;
  432. X    leng[98]  =  90 ;
  433. X    leng[99]  =  30 ;
  434. X    leng[9]   =  60 ;
  435. X    start[0]   = 1830 ;
  436. X    start[100] =  330 ;
  437. X    start[101] = 1500 ;
  438. X    start[102] = 1500 ;
  439. X    start[103] = 2300 ;
  440. X    start[104] = 1900 ;
  441. X    start[105] =  800 ;
  442. X    start[106] =  430 ;
  443. X    start[107] =  300 ;
  444. X    start[108] = 1330 ;
  445. X    start[109] = 1000 ;
  446. X    start[10]  = 1400 ;
  447. X    start[110] =  700 ;
  448. X    start[111] =  100 ;
  449. X    start[112] = 2330 ;
  450. X    start[113] =  330 ;
  451. X    start[114] =  200 ;
  452. X    start[115] = 2230 ;
  453. X    start[116] =  400 ;
  454. X    start[117] =  600 ;
  455. X    start[118] =  400 ;
  456. X    start[119] =  230 ;
  457. X    start[11]  = 2030 ;
  458. X    start[120] =  630 ;
  459. X    start[121] =   30 ;
  460. X    start[122] = 2230 ;
  461. X    start[123] =  100 ;
  462. X    start[124] =   30 ;
  463. X    start[125] = 2300 ;
  464. X    start[126] = 1630 ;
  465. X    start[127] =  830 ;
  466. X    start[128] =    0 ;
  467. X    start[129] = 1930 ;
  468. X    start[12]  = 1700 ;
  469. X    start[130] =  930 ;
  470. X    start[131] = 2030 ;
  471. X    start[132] =  500 ;
  472. X    start[133] = 1730 ;
  473. X    start[134] =  200 ;
  474. X    start[135] = 1930 ;
  475. X    start[136] =  930 ;
  476. X    start[137] = 1730 ;
  477. X    start[138] =  630 ;
  478. X    start[139] = 1830 ;
  479. X    start[13]  = 1600 ;
  480. X    start[140] = 1430 ;
  481. X    start[141] = 1130 ;
  482. X    start[142] =   30 ;
  483. X    start[143] =  830 ;
  484. X    start[144] = 1030 ;
  485. X    start[145] = 1430 ;
  486. X    start[146] =  100 ;
  487. X    start[147] =  730 ;
  488. X    start[148] = 2030 ;
  489. X    start[149] =  300 ;
  490. X    start[14]  = 2000 ;
  491. X    start[150] =  300 ;
  492. X    start[151] = 1330 ;
  493. X    start[152] = 1230 ;
  494. X    start[153] =  230 ;
  495. X    start[154] = 2130 ;
  496. X    start[155] = 1130 ;
  497. X    start[156] = 1830 ;
  498. X    start[157] =  630 ;
  499. X    start[158] =  530 ;
  500. X    start[159] =  200 ;
  501. X    start[15]  = 1500 ;
  502. X    start[160] = 1530 ;
  503. X    start[161] =  730 ;
  504. X    start[162] =  600 ;
  505. X    start[163] = 1730 ;
  506. X    start[164] =  400 ;
  507. X    start[165] =  730 ;
  508. X    start[166] =  430 ;
  509. X    start[167] =  430 ;
  510. X    start[168] =  130 ;
  511. X    start[169] = 1230 ;
  512. X    start[16]  = 2000 ;
  513. X    start[170] =  130 ;
  514. X    start[171] =  230 ;
  515. X    start[172] = 1930 ;
  516. X    start[173] =  300 ;
  517. X    start[174] = 1030 ;
  518. X    start[175] =  200 ;
  519. X    start[176] =  330 ;
  520. X    start[177] =  500 ;
  521. X    start[178] =  930 ;
  522. X    start[179] =  230 ;
  523. X    start[17]  = 2100 ;
  524. X    start[180] = 2030 ;
  525. X    start[181] =  400 ;
  526. X    start[182] = 1530 ;
  527. X    start[183] =  430 ;
  528. X    start[184] = 1330 ;
  529. X    start[185] = 1230 ;
  530. X    start[186] =  330 ;
  531. X    start[187] = 1030 ;
  532. X    start[188] =  500 ;
  533. X    start[189] =  530 ;
  534. X    start[18]  = 2000 ;
  535. X    start[190] =  530 ;
  536. X    start[191] = 1100 ;
  537. X    start[19]  = 1800 ;
  538. X    start[1]   = 1600 ;
  539. X    start[20]  = 1900 ;
  540. X    start[21]  = 2200 ;
  541. X    start[22]  = 2100 ;
  542. X    start[23]  = 1400 ;
  543. X    start[24]  = 1500 ;
  544. X    start[25]  = 2200 ;
  545. X    start[26]  = 1130 ;
  546. X    start[27]  = 1100 ;
  547. X    start[28]  = 2300 ;
  548. X    start[29]  = 1600 ;
  549. X    start[2]   = 1930 ;
  550. X    start[30]  = 2100 ;
  551. X    start[31]  = 2100 ;
  552. X    start[32]  = 1230 ;
  553. X    start[33]  = 1330 ;
  554. X    start[34]  =  930 ;
  555. X    start[35]  = 1300 ;
  556. X    start[36]  = 2130 ;
  557. X    start[37]  = 1200 ;
  558. X    start[38]  = 1000 ;
  559. X    start[39]  = 1800 ;
  560. X    start[3]   = 1630 ;
  561. X    start[40]  = 2200 ;
  562. X    start[41]  = 1200 ;
  563. X    start[42]  =  800 ;
  564. X    start[43]  =  830 ;
  565. X    start[44]  = 1700 ;
  566. X    start[45]  =  900 ;
  567. X    start[46]  = 2230 ;
  568. X    start[47]  = 1030 ;
  569. X    start[48]  = 1900 ;
  570. X    start[49]  =  730 ;
  571. X    start[4]   = 1530 ;
  572. X    start[50]  = 2300 ;
  573. X    start[51]  = 1000 ;
  574. X    start[52]  =  700 ;
  575. X    start[53]  = 1300 ;
  576. X    start[54]  =  700 ;
  577. X    start[55]  = 1100 ;
  578. X    start[56]  = 1400 ;
  579. X    start[57]  = 1000 ;
  580. X    start[58]  =  800 ;
  581. X    start[59]  = 2330 ;
  582. X    start[5]   = 1730 ;
  583. X    start[60]  = 1300 ;
  584. X    start[61]  = 1200 ;
  585. X    start[62]  =  900 ;
  586. X    start[63]  =  630 ;
  587. X    start[64]  = 1800 ;
  588. X    start[65]  =  600 ;
  589. X    start[66]  =  530 ;
  590. X    start[67]  =    0 ;
  591. X    start[68]  = 2330 ;
  592. X    start[69]  = 2200 ;
  593. X    start[6]   = 1800 ;
  594. X    start[70]  = 1300 ;
  595. X    start[71]  =  900 ;
  596. X    start[72]  = 1630 ;
  597. X    start[73]  = 1600 ;
  598. X    start[74]  = 1430 ;
  599. X    start[75]  = 2000 ;
  600. X    start[76]  = 1830 ;
  601. X    start[77]  =  600 ;
  602. X    start[78]  = 1200 ;
  603. X    start[79]  =   30 ;
  604. X    start[7]   = 1430 ;
  605. X    start[80]  =  130 ;
  606. X    start[81]  =    0 ;
  607. X    start[82]  = 1700 ;
  608. X    start[83]  =    0 ;
  609. X    start[84]  =  800 ;
  610. X    start[85]  =  700 ;
  611. X    start[86]  = 2130 ;
  612. X    start[87]  =  500 ;
  613. X    start[88]  = 1530 ;
  614. X    start[89]  = 1130 ;
  615. X    start[8]   = 1900 ;
  616. X    start[90]  = 1100 ;
  617. X    start[91]  =  830 ;
  618. X    start[92]  = 2230 ;
  619. X    start[93]  =  900 ;
  620. X    start[94]  = 2130 ;
  621. X    start[95]  = 1630 ;
  622. X    start[96]  = 2330 ;
  623. X    start[97]  =  100 ;
  624. X    start[98]  = 1400 ;
  625. X    start[99]  =  130 ;
  626. X    start[9]   = 1700 ;
  627. X
  628. X
  629. X    s = 2330;
  630. X    for(j=192; j<240; j++)
  631. X    { start[j] = s; leng[j] = 150; if(0==(j%2)) s-=30; else s-=70; }
  632. X
  633. X    s = 2330;
  634. X    for(j=240; j<288; j++)
  635. X    { start[j] = s; leng[j] = 180; if(0==(j%2)) s-=30; else s-=70; }
  636. X
  637. X    s = 2330;
  638. X    for(j=288; j<336; j++)
  639. X    { start[j] = s; leng[j] = 210; if(0==(j%2)) s-=30; else s-=70; }
  640. X
  641. X    s = 2330;
  642. X    for(j=336; j<384; j++)
  643. X    { start[j] = s; leng[j] = 240; if(0==(j%2)) s-=30; else s-=70; }
  644. X
  645. X    s = 2330;
  646. X    for(j=384; j<432; j++)
  647. X    { start[j] = s; leng[j] = 270; if(0==(j%2)) s-=30; else s-=70; }
  648. X
  649. X    s = 2330;
  650. X    for(j=432; j<480; j++)
  651. X    { start[j] = s; leng[j] = 300; if(0==(j%2)) s-=30; else s-=70; }
  652. X
  653. X    } /* end of initializer block */
  654. X
  655. X
  656. X
  657. X    if((i >= 480) || (i < 0))
  658. X        printf("\nPANIC, Illegal table index %d\n", i);
  659. X
  660. X    fflush(stdout);
  661. X    *outtime = (start[i]) ;
  662. X    *outdur = (leng[i]) ;
  663. X
  664. X    if( (*outtime == INVALID) || (*outdur == INVALID) )
  665. X    {
  666. X        printf("oops, I dont have an entry for index %d\n", i);
  667. X        fflush(stdout);
  668. X        *outtime = 0;
  669. X        *outdur = 0;
  670. X    }
  671. }
  672. X
  673. X
  674. X
  675. X
  676. X
  677. X
  678. void    bit_shuffle(t8c5, t2c1, tval, cval)
  679. X    int    t8c5, t2c1;
  680. X    int    *tval, *cval ;
  681. {
  682. X    int    tt, cc, b;
  683. X
  684. X    tt = 0 ;
  685. X    cc = 0 ;
  686. X
  687. X    /* get t8 thru t3 */
  688. X    b = 0x00000001 & (t8c5 >> 9) ;
  689. X    tt += (b << 8);
  690. X
  691. X    b = 0x00000001 & (t8c5 >> 7) ;
  692. X    tt += (b << 7);
  693. X
  694. X    b = 0x00000001 & (t8c5 >> 5) ;
  695. X    tt += (b << 6);
  696. X
  697. X    b = 0x00000001 & (t8c5 >> 4) ;
  698. X    tt += (b << 5);
  699. X
  700. X    b = 0x00000001 & (t8c5 >> 3) ;
  701. X    tt += (b << 4);
  702. X
  703. X    b = 0x00000001 & t8c5 ;
  704. X    tt += (b << 3);
  705. X
  706. X
  707. X    /* get c5 thru c2 */
  708. X    b = 0x00000001 & (t8c5 >> 8) ;
  709. X    cc += (b << 5);
  710. X
  711. X    b = 0x00000001 & (t8c5 >> 6) ;
  712. X    cc += (b << 4);
  713. X
  714. X    b = 0x00000001 & (t8c5 >> 2) ;
  715. X    cc += (b << 3);
  716. X
  717. X    b = 0x00000001 & (t8c5 >> 1) ;
  718. X    cc += (b << 2) ;
  719. X
  720. X
  721. X    /* get t2 thru t0 */
  722. X    b = 0x00000001 & (t2c1 >> 4) ;
  723. X    tt += (b << 2);
  724. X
  725. X    b = 0x00000001 & (t2c1 >> 2) ;
  726. X    tt += (b << 1);
  727. X
  728. X    b = 0x00000001 & t2c1 ;
  729. X    tt += b;
  730. X
  731. X
  732. X    /* get c1 thru c0 */
  733. X    b = 0x00000001 & (t2c1 >> 3) ;
  734. X    cc += (b << 1);
  735. X
  736. X    b = 0x00000001 & (t2c1 >> 1) ;
  737. X    cc += b ;
  738. X
  739. X    *tval = tt;
  740. X    *cval = cc;
  741. }
  742. X
  743. X
  744. X
  745. X
  746. X
  747. int    map_top(day, year, top, digits)
  748. X    int    day, year, top, digits ;
  749. {
  750. X    int    d2, d1, d0, y, poot ;
  751. X    int    n2, n1, n0, f3, f2, f1, f0;
  752. X
  753. X    y = year % 16 ;
  754. X    d2 = top / 100 ;
  755. X    d1 = (top % 100) / 10 ;
  756. X    d0 = top % 10 ;
  757. X
  758. X    f0 = 1;
  759. X    f1 = (y + 1) % 10;
  760. X    f2 = ( ((y+1)*(y+2)) / 2 ) % 10 ;
  761. X    f3 = ( ((y+1)*(y+2)*(y+3)) / 6 ) % 10 ;
  762. X
  763. X
  764. X    if(digits == 1)
  765. X    {
  766. X        n0 = ( (d0*f0) + (day*f1) ) % 10 ;
  767. X        n1 = 0;
  768. X        n2 = 0;
  769. X    }
  770. X
  771. X    if(digits == 2)
  772. X    {
  773. X        n0 = ( (d0*f0) + (d1*f1) + (day*f2) ) % 10 ;
  774. X        n1 = ( (d1*f0) + (day*f1) ) % 10 ;
  775. X        n2 = 0;
  776. X    }
  777. X
  778. X    if(digits == 3)
  779. X    {
  780. X        n0 = ( (d0*f0) + (d1*f1) + (d2*f2) + (day*f3) ) % 10 ;
  781. X        n1 = ( (d1*f0) + (d2*f1) + (day*f2) ) % 10 ;
  782. X        n2 = ( (d2*f0) + (day*f1) ) % 10 ;
  783. X    }
  784. X
  785. X
  786. X    poot =  (100*n2) + (10*n1) + n0 ;
  787. X
  788. X    return( poot );
  789. }
  790. X
  791. X
  792. X
  793. X
  794. X
  795. void    offset(day, year, top, ofout, topout)
  796. X    int    day, year, top ;
  797. X    int    *ofout, *topout ;
  798. {
  799. X    int    i, t, tx, off, digits, burp;
  800. X    int    pwr ;
  801. X
  802. X    pwr = 1 ; digits = 0;
  803. X    while(top >= pwr) { digits++; pwr *= 10; }
  804. X    pwr = pwr / 10 ;
  805. X
  806. X    t = tx = top ;
  807. X    off = 0;
  808. X    while(tx > 0) { off += (tx % 10);   tx /= 10; }
  809. X
  810. again:
  811. X    for(i=0; i<=(year%16); i++)
  812. X        {
  813. X        burp = ( (map_top(day, i, t, digits)) % 10 ) ;
  814. X        off += burp ;
  815. X        }
  816. X
  817. X    t = map_top(day, year, t, digits) ;
  818. X    if(t < pwr) goto again ;
  819. X
  820. X
  821. X    *ofout = (off % 32) ;
  822. X    *topout = (t) ;
  823. }
  824. X
  825. X
  826. X
  827. X
  828. X
  829. X
  830. X
  831. X
  832. X
  833. X
  834. main(argc, argv)
  835. X    int    argc;
  836. X    char    *argv[];
  837. {
  838. X    int    newspaper ;
  839. X    int    s1_out, bot3, top5, quo, rem ;
  840. X    int    s5_out, mtout, ofout, tval, cval ;
  841. X    int    date_today, month_today, year_today ;
  842. X    int    day_out, channel_out;
  843. X    int    starttime_out, duration_out ;
  844. X
  845. X
  846. X
  847. X    if(argc == 5) goto clean;
  848. X
  849. upchuck:
  850. X    printf("Usage: %s  todays_month  todays_day  todays_year   Code_value_in_newspaper\n",
  851. X        argv[0]);
  852. X    exit(-1) ;
  853. X
  854. X
  855. X
  856. clean:
  857. X
  858. X    month_today = atoi(argv[1]);
  859. X    date_today = atoi(argv[2]);
  860. X    year_today = atoi(argv[3]);
  861. X    newspaper = atoi(argv[4]);
  862. X
  863. X    year_today = year_today % 100 ;
  864. X
  865. X
  866. X    if( (month_today>12) || (month_today<1) || (date_today<1) || (date_today>31) )
  867. X    { printf("Invalid date\n"); goto upchuck; }
  868. X
  869. X    if((newspaper < 1) || (newspaper > 999999))
  870. X    { printf("Sorry, I cant process that code value\n  I can only do codes with 6 digits or fewer\n"); goto upchuck; }
  871. X
  872. X
  873. X
  874. X
  875. X    ofout = INVALID ;
  876. X    mtout = INVALID ;
  877. X
  878. X    s1_out = f1(newspaper); 
  879. X    bot3 = s1_out % 1000;
  880. X    top5 = s1_out / 1000;
  881. X    quo = (bot3 - 1) / 32 ;
  882. X    rem = (bot3 - 1) % 32 ;
  883. X    day_out = quo + 1;
  884. X
  885. X    if(newspaper >= 1000)
  886. X        offset(day_out, year_today, top5, (&ofout), (&mtout)) ;
  887. X    else { mtout = 0; ofout = 0; }
  888. X
  889. X    s5_out = (rem + (day_out*(month_today+1)) + ofout) % 32 ;
  890. X
  891. X
  892. X    bit_shuffle(mtout, s5_out, &tval, &cval);
  893. X    channel_out = cval + 1;
  894. X    lookup(tval, (&starttime_out), (&duration_out));
  895. X
  896. X    printf("Code= %6d    %2d  %2d  %2d   Mapped_channel= %2d  Start_time= %4d  Length= %3d\n",
  897. X        newspaper, month_today, day_out, year_today, channel_out, starttime_out, duration_out);
  898. X
  899. }
  900. SHAR_EOF
  901. chmod 0400 decode.c ||
  902. echo 'restore of decode.c failed'
  903. Wc_c="`wc -c < 'decode.c'`"
  904. test 13721 -eq "$Wc_c" ||
  905.     echo 'decode.c: original size 13721, current size' "$Wc_c"
  906. fi
  907. # ============= encode.c ==============
  908. if test -f 'encode.c' -a X"$1" != X"-c"; then
  909.     echo 'x - skipping encode.c (File already exists)'
  910. else
  911. echo 'x - extracting encode.c (Text)'
  912. sed 's/^X//' << 'SHAR_EOF' > 'encode.c' &&
  913. #include <stdio.h>
  914. X
  915. #define        KEY001    (9371)
  916. #define        INVALID    (-987)
  917. X
  918. X
  919. /* function that performs initial scrambling */
  920. int    mixup(x, y)
  921. X    int    x, y;
  922. {
  923. X    int    i, j, k, sum;
  924. X
  925. X    int    a[12], b[12], out[12] ;
  926. X
  927. X    /* get the digits of x into a[] */
  928. X    j = x ;
  929. X    for(i=0; i<9; i++)
  930. X    {
  931. X        k = j % 10;
  932. X        a[i] = k;
  933. X        j = (j - k) / 10 ;
  934. X    }
  935. X
  936. X    /* get the digits of y into b[] */
  937. X    j = y ;
  938. X    for(i=0; i<9; i++)
  939. X    {
  940. X        k = j % 10;
  941. X        b[i] = k;
  942. X        j = (j - k) / 10 ;
  943. X        out[i] = 0;
  944. X    }
  945. X
  946. X
  947. X    for(i=0; i<=8; i++)
  948. X    {
  949. X        for(j=0; j<=8; j++)
  950. X        {
  951. X            out[i+j] += (b[j] * a[i]) ;
  952. X        }
  953. X    }
  954. X
  955. X    j = 1;
  956. X    sum = 0;
  957. X    for(i=0; i<=8; i++)
  958. X    {
  959. X        sum += j * (out[i] % 10);
  960. X        j = j * 10 ;
  961. X    }
  962. X    return( sum ) ;
  963. }
  964. X
  965. X
  966. X
  967. /* first function */
  968. int    f1(inval)
  969. X    int    inval ;
  970. {
  971. X    int    ndigits, hashval ;
  972. X    int    pwr ;
  973. X
  974. X
  975. X    ndigits = 0;
  976. X    pwr = 1;
  977. X    while(inval >= pwr) { ndigits++; pwr *= 10; }
  978. X    if(ndigits > 8) printf("\nPANIC: %d has %d digits\n", inval, ndigits);
  979. X    pwr = pwr / 10 ;
  980. X
  981. X    hashval = inval;
  982. again:    hashval = mixup(hashval, KEY001) % (pwr * 10) ;
  983. X    if(hashval < pwr) goto again ;
  984. X
  985. X    return(hashval);
  986. }
  987. X
  988. X
  989. X
  990. X
  991. /* the 512-entry tables of starting time and pgm duration */
  992. int    lookup(stime, durat)
  993. X    int    stime, durat ;
  994. {
  995. X    static    int    start[480], leng[480] ;
  996. X    static    int    initializer = 0;
  997. X
  998. X    int    s, j;
  999. X
  1000. X    if(initializer == 0) {
  1001. X    initializer = 1;
  1002. X
  1003. X    for(j=0; j<512; j++) { start[j] = leng[j] = INVALID; }
  1004. X
  1005. X    leng[0]   =  30 ;
  1006. X    leng[100] = 120 ;
  1007. X    leng[101] =  90 ;
  1008. X    leng[102] = 120 ;
  1009. X    leng[103] = 120 ;
  1010. X    leng[104] =  90 ;
  1011. X    leng[105] =  90 ;
  1012. X    leng[106] =  30 ;
  1013. X    leng[107] =  30 ;
  1014. X    leng[108] = 120 ;
  1015. X    leng[109] =  90 ;
  1016. X    leng[10]  =  30 ;
  1017. X    leng[110] =  90 ;
  1018. X    leng[111] =  30 ;
  1019. X    leng[112] =  90 ;
  1020. X    leng[113] =  30 ;
  1021. X    leng[114] =  30 ;
  1022. X    leng[115] = 120 ;
  1023. X    leng[116] =  30 ;
  1024. X    leng[117] = 120 ;
  1025. X    leng[118] = 120 ;
  1026. X    leng[119] =  30 ;
  1027. X    leng[11]  =  30 ;
  1028. X    leng[120] =  90 ;
  1029. X    leng[121] =  60 ;
  1030. X    leng[122] =  60 ;
  1031. X    leng[123] =  60 ;
  1032. X    leng[124] = 120 ;
  1033. X    leng[125] =  90 ;
  1034. X    leng[126] =  60 ;
  1035. X    leng[127] =  60 ;
  1036. X    leng[128] =  90 ;
  1037. X    leng[129] = 120 ;
  1038. X    leng[12]  =  30 ;
  1039. X    leng[130] = 120 ;
  1040. X    leng[131] =  90 ;
  1041. X    leng[132] =  60 ;
  1042. X    leng[133] =  60 ;
  1043. X    leng[134] = 120 ;
  1044. X    leng[135] =  90 ;
  1045. X    leng[136] =  90 ;
  1046. X    leng[137] = 120 ;
  1047. X    leng[138] = 120 ;
  1048. X    leng[139] =  60 ;
  1049. X    leng[13]  = 120 ;
  1050. X    leng[140] =  60 ;
  1051. X    leng[141] =  90 ;
  1052. X    leng[142] =  90 ;
  1053. X    leng[143] = 120 ;
  1054. X    leng[144] =  90 ;
  1055. X    leng[145] = 120 ;
  1056. X    leng[146] =  90 ;
  1057. X    leng[147] = 120 ;
  1058. X    leng[148] = 120 ;
  1059. X    leng[149] =  90 ;
  1060. X    leng[14]  =  30 ;
  1061. X    leng[150] = 120 ;
  1062. X    leng[151] =  90 ;
  1063. X    leng[152] =  90 ;
  1064. X    leng[153] =  90 ;
  1065. X    leng[154] =  60 ;
  1066. X    leng[155] =  60 ;
  1067. X    leng[156] = 120 ;
  1068. X    leng[157] =  60 ;
  1069. X    leng[158] =  60 ;
  1070. X    leng[159] =  60 ;
  1071. X    leng[15]  =  30 ;
  1072. X    leng[160] = 120 ;
  1073. X    leng[161] =  60 ;
  1074. X    leng[162] =  90 ;
  1075. X    leng[163] =  90 ;
  1076. X    leng[164] =  60 ;
  1077. X    leng[165] =  90 ;
  1078. X    leng[166] =  90 ;
  1079. X    leng[167] =  60 ;
  1080. X    leng[168] =  90 ;
  1081. X    leng[169] = 120 ;
  1082. X    leng[16]  = 120 ;
  1083. X    leng[170] =  60 ;
  1084. X    leng[171] = 120 ;
  1085. X    leng[172] =  60 ;
  1086. X    leng[173] =  60 ;
  1087. X    leng[174] = 120 ;
  1088. X    leng[175] =  90 ;
  1089. X    leng[176] =  60 ;
  1090. X    leng[177] = 120 ;
  1091. X    leng[178] =  60 ;
  1092. X    leng[179] =  60 ;
  1093. X    leng[17]  = 120 ;
  1094. X    leng[180] =  60 ;
  1095. X    leng[181] =  90 ;
  1096. X    leng[182] =  60 ;
  1097. X    leng[183] = 120 ;
  1098. X    leng[184] =  60 ;
  1099. X    leng[185] =  60 ;
  1100. X    leng[186] =  90 ;
  1101. X    leng[187] =  60 ;
  1102. X    leng[188] =  90 ;
  1103. X    leng[189] = 120 ;
  1104. X    leng[18]  =  60 ;
  1105. X    leng[190] =  90 ;
  1106. X    leng[191] =  90 ;
  1107. X    leng[19]  = 120 ;
  1108. X    leng[1]   =  30 ;
  1109. X    leng[20]  =  60 ;
  1110. X    leng[21]  =  60 ;
  1111. X    leng[22]  =  60 ;
  1112. X    leng[23]  = 120 ;
  1113. X    leng[24]  =  60 ;
  1114. X    leng[25]  = 120 ;
  1115. X    leng[26]  =  30 ;
  1116. X    leng[27]  =  30 ;
  1117. X    leng[28]  =  30 ;
  1118. X    leng[29]  =  60 ;
  1119. X    leng[2]   =  30 ;
  1120. X    leng[30]  =  90 ;
  1121. X    leng[31]  =  30 ;
  1122. X    leng[32]  =  30 ;
  1123. X    leng[33]  =  30 ;
  1124. X    leng[34]  =  30 ;
  1125. X    leng[35]  =  60 ;
  1126. X    leng[36]  =  30 ;
  1127. X    leng[37]  =  60 ;
  1128. X    leng[38]  = 120 ;
  1129. X    leng[39]  =  60 ;
  1130. X    leng[3]   =  30 ;
  1131. X    leng[40]  =  30 ;
  1132. X    leng[41]  =  30 ;
  1133. X    leng[42]  =  30 ;
  1134. X    leng[43]  =  30 ;
  1135. X    leng[44]  = 120 ;
  1136. X    leng[45]  =  30 ;
  1137. X    leng[46]  =  30 ;
  1138. X    leng[47]  =  30 ;
  1139. X    leng[48]  = 120 ;
  1140. X    leng[49]  =  30 ;
  1141. X    leng[4]   =  30 ;
  1142. X    leng[50]  =  60 ;
  1143. X    leng[51]  =  60 ;
  1144. X    leng[52]  =  30 ;
  1145. X    leng[53]  =  30 ;
  1146. X    leng[54]  = 120 ;
  1147. X    leng[55]  =  60 ;
  1148. X    leng[56]  =  60 ;
  1149. X    leng[57]  =  30 ;
  1150. X    leng[58]  = 120 ;
  1151. X    leng[59]  =  30 ;
  1152. X    leng[5]   =  30 ;
  1153. X    leng[60]  = 120 ;
  1154. X    leng[61]  = 120 ;
  1155. X    leng[62]  = 120 ;
  1156. X    leng[63]  =  30 ;
  1157. X    leng[64]  =  90 ;
  1158. X    leng[65]  =  30 ;
  1159. X    leng[66]  =  30 ;
  1160. X    leng[67]  =  30 ;
  1161. X    leng[68]  = 120 ;
  1162. X    leng[69]  =  90 ;
  1163. X    leng[6]   =  30 ;
  1164. X    leng[70]  =  90 ;
  1165. X    leng[71]  =  60 ;
  1166. X    leng[72]  =  90 ;
  1167. X    leng[73]  =  90 ;
  1168. X    leng[74]  =  90 ;
  1169. X    leng[75]  =  90 ;
  1170. X    leng[76]  =  90 ;
  1171. X    leng[77]  =  60 ;
  1172. X    leng[78]  =  90 ;
  1173. X    leng[79]  =  30 ;
  1174. X    leng[7]   =  30 ;
  1175. X    leng[80]  = 120 ;
  1176. X    leng[81]  =  60 ;
  1177. X    leng[82]  =  90 ;
  1178. X    leng[83]  = 120 ;
  1179. X    leng[84]  =  60 ;
  1180. X    leng[85]  =  60 ;
  1181. X    leng[86]  = 120 ;
  1182. X    leng[87]  =  30 ;
  1183. X    leng[88]  =  90 ;
  1184. X    leng[89]  = 120 ;
  1185. X    leng[8]   =  30 ;
  1186. X    leng[90]  = 120 ;
  1187. X    leng[91]  =  90 ;
  1188. X    leng[92]  =  90 ;
  1189. X    leng[93]  =  90 ;
  1190. X    leng[94]  =  90 ;
  1191. X    leng[95]  = 120 ;
  1192. X    leng[96]  =  60 ;
  1193. X    leng[97]  = 120 ;
  1194. X    leng[98]  =  90 ;
  1195. X    leng[99]  =  30 ;
  1196. X    leng[9]   =  60 ;
  1197. X    start[0]   = 1830 ;
  1198. X    start[100] =  330 ;
  1199. X    start[101] = 1500 ;
  1200. X    start[102] = 1500 ;
  1201. X    start[103] = 2300 ;
  1202. X    start[104] = 1900 ;
  1203. X    start[105] =  800 ;
  1204. X    start[106] =  430 ;
  1205. X    start[107] =  300 ;
  1206. X    start[108] = 1330 ;
  1207. X    start[109] = 1000 ;
  1208. X    start[10]  = 1400 ;
  1209. X    start[110] =  700 ;
  1210. X    start[111] =  100 ;
  1211. X    start[112] = 2330 ;
  1212. X    start[113] =  330 ;
  1213. X    start[114] =  200 ;
  1214. X    start[115] = 2230 ;
  1215. X    start[116] =  400 ;
  1216. X    start[117] =  600 ;
  1217. X    start[118] =  400 ;
  1218. X    start[119] =  230 ;
  1219. X    start[11]  = 2030 ;
  1220. X    start[120] =  630 ;
  1221. X    start[121] =   30 ;
  1222. X    start[122] = 2230 ;
  1223. X    start[123] =  100 ;
  1224. X    start[124] =   30 ;
  1225. X    start[125] = 2300 ;
  1226. X    start[126] = 1630 ;
  1227. X    start[127] =  830 ;
  1228. X    start[128] =    0 ;
  1229. X    start[129] = 1930 ;
  1230. X    start[12]  = 1700 ;
  1231. X    start[130] =  930 ;
  1232. X    start[131] = 2030 ;
  1233. X    start[132] =  500 ;
  1234. X    start[133] = 1730 ;
  1235. X    start[134] =  200 ;
  1236. X    start[135] = 1930 ;
  1237. X    start[136] =  930 ;
  1238. X    start[137] = 1730 ;
  1239. X    start[138] =  630 ;
  1240. X    start[139] = 1830 ;
  1241. X    start[13]  = 1600 ;
  1242. X    start[140] = 1430 ;
  1243. X    start[141] = 1130 ;
  1244. X    start[142] =   30 ;
  1245. X    start[143] =  830 ;
  1246. X    start[144] = 1030 ;
  1247. X    start[145] = 1430 ;
  1248. X    start[146] =  100 ;
  1249. X    start[147] =  730 ;
  1250. X    start[148] = 2030 ;
  1251. X    start[149] =  300 ;
  1252. X    start[14]  = 2000 ;
  1253. X    start[150] =  300 ;
  1254. X    start[151] = 1330 ;
  1255. X    start[152] = 1230 ;
  1256. X    start[153] =  230 ;
  1257. X    start[154] = 2130 ;
  1258. X    start[155] = 1130 ;
  1259. X    start[156] = 1830 ;
  1260. X    start[157] =  630 ;
  1261. X    start[158] =  530 ;
  1262. X    start[159] =  200 ;
  1263. X    start[15]  = 1500 ;
  1264. X    start[160] = 1530 ;
  1265. X    start[161] =  730 ;
  1266. X    start[162] =  600 ;
  1267. X    start[163] = 1730 ;
  1268. X    start[164] =  400 ;
  1269. X    start[165] =  730 ;
  1270. X    start[166] =  430 ;
  1271. X    start[167] =  430 ;
  1272. X    start[168] =  130 ;
  1273. X    start[169] = 1230 ;
  1274. X    start[16]  = 2000 ;
  1275. X    start[170] =  130 ;
  1276. X    start[171] =  230 ;
  1277. X    start[172] = 1930 ;
  1278. X    start[173] =  300 ;
  1279. X    start[174] = 1030 ;
  1280. X    start[175] =  200 ;
  1281. X    start[176] =  330 ;
  1282. X    start[177] =  500 ;
  1283. X    start[178] =  930 ;
  1284. X    start[179] =  230 ;
  1285. X    start[17]  = 2100 ;
  1286. X    start[180] = 2030 ;
  1287. X    start[181] =  400 ;
  1288. X    start[182] = 1530 ;
  1289. X    start[183] =  430 ;
  1290. X    start[184] = 1330 ;
  1291. X    start[185] = 1230 ;
  1292. X    start[186] =  330 ;
  1293. X    start[187] = 1030 ;
  1294. X    start[188] =  500 ;
  1295. X    start[189] =  530 ;
  1296. X    start[18]  = 2000 ;
  1297. X    start[190] =  530 ;
  1298. X    start[191] = 1100 ;
  1299. X    start[19]  = 1800 ;
  1300. X    start[1]   = 1600 ;
  1301. X    start[20]  = 1900 ;
  1302. X    start[21]  = 2200 ;
  1303. X    start[22]  = 2100 ;
  1304. X    start[23]  = 1400 ;
  1305. X    start[24]  = 1500 ;
  1306. X    start[25]  = 2200 ;
  1307. X    start[26]  = 1130 ;
  1308. X    start[27]  = 1100 ;
  1309. X    start[28]  = 2300 ;
  1310. X    start[29]  = 1600 ;
  1311. X    start[2]   = 1930 ;
  1312. X    start[30]  = 2100 ;
  1313. X    start[31]  = 2100 ;
  1314. X    start[32]  = 1230 ;
  1315. X    start[33]  = 1330 ;
  1316. X    start[34]  =  930 ;
  1317. X    start[35]  = 1300 ;
  1318. X    start[36]  = 2130 ;
  1319. X    start[37]  = 1200 ;
  1320. X    start[38]  = 1000 ;
  1321. X    start[39]  = 1800 ;
  1322. X    start[3]   = 1630 ;
  1323. X    start[40]  = 2200 ;
  1324. X    start[41]  = 1200 ;
  1325. X    start[42]  =  800 ;
  1326. X    start[43]  =  830 ;
  1327. X    start[44]  = 1700 ;
  1328. X    start[45]  =  900 ;
  1329. X    start[46]  = 2230 ;
  1330. X    start[47]  = 1030 ;
  1331. X    start[48]  = 1900 ;
  1332. X    start[49]  =  730 ;
  1333. X    start[4]   = 1530 ;
  1334. X    start[50]  = 2300 ;
  1335. X    start[51]  = 1000 ;
  1336. X    start[52]  =  700 ;
  1337. X    start[53]  = 1300 ;
  1338. X    start[54]  =  700 ;
  1339. X    start[55]  = 1100 ;
  1340. X    start[56]  = 1400 ;
  1341. X    start[57]  = 1000 ;
  1342. X    start[58]  =  800 ;
  1343. X    start[59]  = 2330 ;
  1344. X    start[5]   = 1730 ;
  1345. X    start[60]  = 1300 ;
  1346. X    start[61]  = 1200 ;
  1347. X    start[62]  =  900 ;
  1348. X    start[63]  =  630 ;
  1349. X    start[64]  = 1800 ;
  1350. X    start[65]  =  600 ;
  1351. X    start[66]  =  530 ;
  1352. X    start[67]  =    0 ;
  1353. X    start[68]  = 2330 ;
  1354. X    start[69]  = 2200 ;
  1355. X    start[6]   = 1800 ;
  1356. X    start[70]  = 1300 ;
  1357. X    start[71]  =  900 ;
  1358. X    start[72]  = 1630 ;
  1359. X    start[73]  = 1600 ;
  1360. X    start[74]  = 1430 ;
  1361. X    start[75]  = 2000 ;
  1362. X    start[76]  = 1830 ;
  1363. X    start[77]  =  600 ;
  1364. X    start[78]  = 1200 ;
  1365. X    start[79]  =   30 ;
  1366. X    start[7]   = 1430 ;
  1367. X    start[80]  =  130 ;
  1368. X    start[81]  =    0 ;
  1369. X    start[82]  = 1700 ;
  1370. X    start[83]  =    0 ;
  1371. X    start[84]  =  800 ;
  1372. X    start[85]  =  700 ;
  1373. X    start[86]  = 2130 ;
  1374. X    start[87]  =  500 ;
  1375. X    start[88]  = 1530 ;
  1376. X    start[89]  = 1130 ;
  1377. X    start[8]   = 1900 ;
  1378. X    start[90]  = 1100 ;
  1379. X    start[91]  =  830 ;
  1380. X    start[92]  = 2230 ;
  1381. X    start[93]  =  900 ;
  1382. X    start[94]  = 2130 ;
  1383. X    start[95]  = 1630 ;
  1384. X    start[96]  = 2330 ;
  1385. X    start[97]  =  100 ;
  1386. X    start[98]  = 1400 ;
  1387. X    start[99]  =  130 ;
  1388. X    start[9]   = 1700 ;
  1389. X
  1390. X
  1391. X    s = 2330;
  1392. X    for(j=192; j<240; j++)
  1393. X    { start[j] = s; leng[j] = 150; if(0==(j%2)) s-=30; else s-=70; }
  1394. X
  1395. X    s = 2330;
  1396. X    for(j=240; j<288; j++)
  1397. X    { start[j] = s; leng[j] = 180; if(0==(j%2)) s-=30; else s-=70; }
  1398. X
  1399. X    s = 2330;
  1400. X    for(j=288; j<336; j++)
  1401. X    { start[j] = s; leng[j] = 210; if(0==(j%2)) s-=30; else s-=70; }
  1402. X
  1403. X    s = 2330;
  1404. X    for(j=336; j<384; j++)
  1405. X    { start[j] = s; leng[j] = 240; if(0==(j%2)) s-=30; else s-=70; }
  1406. X
  1407. X    s = 2330;
  1408. X    for(j=384; j<432; j++)
  1409. X    { start[j] = s; leng[j] = 270; if(0==(j%2)) s-=30; else s-=70; }
  1410. X
  1411. X    s = 2330;
  1412. X    for(j=432; j<480; j++)
  1413. X    { start[j] = s; leng[j] = 300; if(0==(j%2)) s-=30; else s-=70; }
  1414. X
  1415. X    } /* end of initializer block */
  1416. X
  1417. X
  1418. X    for(j=0; j<481; j++)
  1419. X    {
  1420. X        if(stime == start[j]) {
  1421. X            if(durat == leng[j]) break ;
  1422. X            }
  1423. X    }
  1424. X
  1425. X    if( j >= 480 )
  1426. X    {
  1427. X        printf("oops, I dont have an entry for index %d\n", j);
  1428. X        fflush(stdout);
  1429. X        j = 0;
  1430. X    }
  1431. X
  1432. X    return(j);
  1433. }
  1434. X
  1435. X
  1436. X
  1437. X
  1438. X
  1439. X
  1440. void    interleave(tblidx, cval, t8c5, t2c1)
  1441. X    int    tblidx, cval ;
  1442. X    int    *t8c5, *t2c1;
  1443. {
  1444. X    int    small, big, b;
  1445. X
  1446. X    small = 0;
  1447. X    big = 0;
  1448. X
  1449. X    /* build t2c1 */
  1450. X    b = 0x00000001 & (tblidx >> 2) ;
  1451. X    small += (b << 4);
  1452. X
  1453. X    b = 0x00000001 & (tblidx >> 1) ;
  1454. X    small += (b << 2);
  1455. X
  1456. X    b = 0x00000001 & tblidx ;
  1457. X    small += b;
  1458. X
  1459. X    b = 0x00000001 & (cval >> 1) ;
  1460. X    small += (b << 3);
  1461. X
  1462. X    b = 0x00000001 & cval ;
  1463. X    small += (b << 1);
  1464. X
  1465. X
  1466. X    /* build t8c5 */
  1467. X    b = 0x00000001 & (tblidx >> 8) ;
  1468. X    big += (b << 9);
  1469. X
  1470. X    b = 0x00000001 & (tblidx >> 7) ;
  1471. X    big += (b << 7);
  1472. X
  1473. X    b = 0x00000001 & (tblidx >> 6) ;
  1474. X    big += (b << 5);
  1475. X
  1476. X    b = 0x00000001 & (tblidx >> 5) ;
  1477. X    big += (b << 4);
  1478. X
  1479. X    b = 0x00000001 & (tblidx >> 4) ;
  1480. X    big += (b << 3);
  1481. X
  1482. X    b = 0x00000001 & (tblidx >> 3) ;
  1483. X    big += b;
  1484. X
  1485. X    b = 0x00000001 & (cval >> 5) ;
  1486. X    big += (b << 8);
  1487. X
  1488. X    b = 0x00000001 & (cval >> 4) ;
  1489. X    big += (b << 6);
  1490. X
  1491. X    b = 0x00000001 & (cval >> 3) ;
  1492. X    big += (b << 2);
  1493. X
  1494. X    b = 0x00000001 & (cval >> 2) ;
  1495. X    big += (b << 1);
  1496. X
  1497. X
  1498. X    *t8c5 = big;
  1499. X    *t2c1 = small;
  1500. }
  1501. X
  1502. X
  1503. X
  1504. X
  1505. X
  1506. int    map_top(day, year, top, digits)
  1507. X    int    day, year, top, digits ;
  1508. {
  1509. X    int    d2, d1, d0, y, poot ;
  1510. X    int    n2, n1, n0, f3, f2, f1, f0;
  1511. X
  1512. X    y = year % 16 ;
  1513. X    d2 = top / 100 ;
  1514. X    d1 = (top % 100) / 10 ;
  1515. X    d0 = top % 10 ;
  1516. X
  1517. X    f0 = 1;
  1518. X    f1 = (y + 1) % 10;
  1519. X    f2 = ( ((y+1)*(y+2)) / 2 ) % 10 ;
  1520. X    f3 = ( ((y+1)*(y+2)*(y+3)) / 6 ) % 10 ;
  1521. X
  1522. X
  1523. X    if(digits == 1)
  1524. X    {
  1525. X        n0 = ( (d0*f0) + (day*f1) ) % 10 ;
  1526. X        n1 = 0;
  1527. X        n2 = 0;
  1528. X    }
  1529. X
  1530. X    if(digits == 2)
  1531. X    {
  1532. X        n0 = ( (d0*f0) + (d1*f1) + (day*f2) ) % 10 ;
  1533. X        n1 = ( (d1*f0) + (day*f1) ) % 10 ;
  1534. X        n2 = 0;
  1535. X    }
  1536. X
  1537. X    if(digits == 3)
  1538. X    {
  1539. X        n0 = ( (d0*f0) + (d1*f1) + (d2*f2) + (day*f3) ) % 10 ;
  1540. X        n1 = ( (d1*f0) + (d2*f1) + (day*f2) ) % 10 ;
  1541. X        n2 = ( (d2*f0) + (day*f1) ) % 10 ;
  1542. X    }
  1543. X
  1544. X
  1545. X    poot =  (100*n2) + (10*n1) + n0 ;
  1546. X
  1547. X    return( poot );
  1548. }
  1549. X
  1550. X
  1551. X
  1552. X
  1553. X
  1554. void    offset(day, year, top, ofout, topout)
  1555. X    int    day, year, top ;
  1556. X    int    *ofout, *topout ;
  1557. {
  1558. X    int    i, t, tx, off, digits, burp;
  1559. X    int    pwr ;
  1560. X
  1561. X
  1562. X    pwr = 1 ; digits = 0;
  1563. X    while(top >= pwr) { digits++; pwr *= 10; }
  1564. X    pwr = pwr / 10 ;
  1565. X
  1566. X    t = tx = top ;
  1567. X    off = 0;
  1568. X    while(tx > 0) { off += (tx % 10);   tx /= 10; }
  1569. X
  1570. again:
  1571. X    for(i=0; i<=(year%16); i++)
  1572. X        {
  1573. X        burp = ( (map_top(day, i, t, digits)) % 10 ) ;
  1574. X        off += burp ;
  1575. X        }
  1576. X
  1577. X    t = map_top(day, year, t, digits) ;
  1578. X    if(t < pwr) goto again ;
  1579. X
  1580. X
  1581. X    *ofout = (off % 32) ;
  1582. X    *topout = (t) ;
  1583. }
  1584. X
  1585. X
  1586. X
  1587. X
  1588. X
  1589. X
  1590. X
  1591. X
  1592. X
  1593. X
  1594. main(argc, argv)
  1595. X    int    argc;
  1596. X    char    *argv[];
  1597. {
  1598. X    int    j, doneflag, trailers, tblidx ;
  1599. X    int    s1_out, bot3, top5, quo, rem, newspaper ;
  1600. X    int    s4_out, s5_out, ofout, cval ;
  1601. X    int    month, day, year, channel, starttime, duration ;
  1602. X
  1603. X
  1604. X
  1605. X    if(argc == 7) goto clean;
  1606. X
  1607. upchuck:
  1608. X    printf("Usage: %s  month  day  year  channel  starting_time  length_in_minutes\n",
  1609. X        argv[0]);
  1610. X    exit(-1) ;
  1611. X
  1612. X
  1613. X
  1614. clean:
  1615. X
  1616. X    month = atoi(argv[1]);
  1617. X    day = atoi(argv[2]);
  1618. X    year = atoi(argv[3]);
  1619. X    channel = atoi(argv[4]);
  1620. X    starttime = atoi(argv[5]);
  1621. X    duration = atoi(argv[6]);
  1622. X
  1623. X    year = year % 100 ;
  1624. X
  1625. X    if( (month>12) || (month<1) || (day<1) || (day>31) )
  1626. X    { printf("Invalid date\n"); goto upchuck; }
  1627. X
  1628. X    if( (channel<1) || (channel>48) )
  1629. X    { printf("Invalid channel number\n"); goto upchuck; }
  1630. X
  1631. X    trailers = starttime % 100;
  1632. X    if((trailers != 0) && (trailers != 30))
  1633. X    { printf("Invalid start time\n"); goto upchuck; }
  1634. X
  1635. X    if((starttime < 0) || (starttime > 2330))
  1636. X    { printf("Sorry, I cant process that starting time\n"); goto upchuck; }
  1637. X
  1638. X    trailers = duration % 30;
  1639. X    if((trailers!=0) || (duration<30) || (duration>300))
  1640. X    { printf("Sorry, I cant process that program length\n"); goto upchuck; }
  1641. X
  1642. X
  1643. X    /* get the  t  bits and the  c  bits */
  1644. X    cval = channel - 1 ;
  1645. X    tblidx = lookup(starttime, duration);
  1646. X
  1647. X    /* from them infer what must have been step 4 & step 5 results */
  1648. X    interleave(tblidx, cval, (&s4_out), (&s5_out)) ;
  1649. X
  1650. X    /* find the smallest unmapped_top giving correct mapped_top */
  1651. X    top5 = 0;
  1652. X    doneflag = 0;
  1653. X
  1654. X    /* if the mapped_top is zero then top and offset are zero */
  1655. X    if(s4_out == 0) { top5 = 0; ofout = 0; doneflag = 1; }
  1656. X
  1657. X    while(doneflag == 0)
  1658. X    {
  1659. X        top5++;
  1660. X        offset(day, year, top5, (&ofout), (&j)) ;
  1661. X        if(j == s4_out) doneflag = 1;
  1662. X    }
  1663. X
  1664. X    /* have two of the three inputs to step 5; determine the rem */
  1665. X    for(rem=0; rem<32; rem++)
  1666. X    {
  1667. X        j = (rem + (day*(month+1)) + ofout) % 32 ;
  1668. X        if(j == s5_out) break ;
  1669. X    }
  1670. X    quo = (day - 1);
  1671. X
  1672. X
  1673. X    /* assemble the output of step 1 */
  1674. X    bot3 = 1 + rem + (32 * quo) ;
  1675. X    s1_out = bot3 + (1000 * top5) ;
  1676. X
  1677. X    /* invert the mixing */
  1678. X    newspaper = f1(s1_out);
  1679. X
  1680. X    printf(" %2d  %2d  %2d %3d  %4d  %3d    VCRPLUS_CODE= %8d\n",
  1681. X        month, day, year, channel, starttime, duration, newspaper);
  1682. X
  1683. }
  1684. SHAR_EOF
  1685. chmod 0400 encode.c ||
  1686. echo 'restore of encode.c failed'
  1687. Wc_c="`wc -c < 'encode.c'`"
  1688. test 14248 -eq "$Wc_c" ||
  1689.     echo 'encode.c: original size 14248, current size' "$Wc_c"
  1690. fi
  1691. exit 0
  1692.