home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / misc / volume6 / tape < prev    next >
Text File  |  1989-03-04  |  36KB  |  1,556 lines

  1. Newsgroups: comp.sources.misc
  2. From: allbery@uunet.UU.NET (Brandon S. Allbery - comp.sources.misc)
  3. Subject: v06i046: tape - an audio tape data base program
  4. Reply-To: bleckmd@jacobs.CS.ORST.EDU (david bleckmann)
  5.  
  6. Posting-number: Volume 6, Issue 46
  7. Submitted-by: bleckmd@jacobs.CS.ORST.EDU (david bleckmann)
  8. Archive-name: tape
  9.  
  10. Hopefully I have followed all protocol, here is my submission:
  11. [That long a signature isn't quite correct protocol, but... ok.  ++bsa]
  12.  
  13.  <------- ____  
  14.   &&&    /    \  __ _____,
  15.     `-- |  o   \'  `  &&/   David Bleckmann
  16.        `|      | o  },-'    UUCP: {tektronix,hp-pcd}!orstcs
  17.          \____( )__/                           !jacobs.cs.orst.edu!bleckmd    
  18.          ,'    \'   \       Internet/CSNet: bleckmd@jacobs.cs.orst.edu
  19.  /~~~~~~|.      |   .}~~~\    or:bleckmd%jacobs.cs.orst.edu@orstcs.cs.orst.edu
  20.   ,-----( .     |   .}--.   
  21.         | .    /\___/          US Mail: 861 SW Adams #3
  22.          `----^,\ \                     Corvallis, OR 97333
  23.                 \_/   ACK!
  24.  
  25.  
  26.  
  27. -----------------------------------------------
  28.  
  29. Tape data base program.  See README.DOC for complete description.
  30. Basically used for cataloging and alphabetizing a large number
  31. of audio (or other) tapes.  Runs on UNIX systems (at least BSD)
  32. and hopefully MS DOS as well.
  33.  
  34. ---- Cut Here and unpack ----
  35. #!/bin/sh
  36. # shar:    Shell Archiver  (v1.22)
  37. #    Packed Sun Feb 12 15:08:40 PST 1989 by jacobs.CS.ORST.EDU!bleckmd
  38. #    from directory /mnt/dave/src/tape
  39. #
  40. #    Run the following text with /bin/sh to create:
  41. #      Makefile
  42. #      README.DOC
  43. #      alpha.c
  44. #      dave.t
  45. #      header.h
  46. #      io.c
  47. #      main.c
  48. #      tape.prj
  49. #
  50. if test -f Makefile; then echo "File Makefile exists"; else
  51. echo "x - extracting Makefile (Text)"
  52. sed 's/^X//' << 'SHAR_EOF' > Makefile &&
  53. XOBJ= main.o io.o alpha.o
  54. XSRC= header.h main.c io.c alpha.c
  55. X
  56. X#For system V get rid of -ltermcap
  57. XLIB= -lcurses -ltermcap
  58. X
  59. X#Output file
  60. XEXE= tape
  61. X
  62. Xall: $(OBJ)
  63. X    cc -o $(EXE) $(OBJ) $(LIB)
  64. X
  65. X$(OBJ):header.h
  66. X
  67. Xclean:
  68. X    rm -f $(OBJ) core make.out
  69. X
  70. Xkill:
  71. X    rm -f $(OBJ) core make.out $(EXE)
  72. X
  73. X#local dependancy, not very useful ;-)
  74. Xprint:
  75. X    lpr -Porstcs $(SRC)
  76. SHAR_EOF
  77. chmod 0640 Makefile || echo "restore of Makefile fails"
  78. set `wc -c Makefile`;Sum=$1
  79. if test "$Sum" != "347"
  80. then echo original size 347, current size $Sum;fi
  81. fi
  82. if test -f README.DOC; then echo "File README.DOC exists"; else
  83. echo "x - extracting README.DOC (Text)"
  84. sed 's/^X//' << 'SHAR_EOF' > README.DOC &&
  85. XTape organiser - By David Bleckmann
  86. X
  87. XUse to organize tapes in a manner so that a certain tape side
  88. Xcan be found quickly and easily.  
  89. X
  90. XA problem with a large tape collection is that it is often hard
  91. Xto order your tapes so that you can find a particular album by
  92. Xa particular artist.  One way to try to solve this problem is
  93. Xto alphabetize your tapes according to the artist on the first
  94. Xside.  However, if the artist on the second side is different
  95. Xyou are forced to remember which tape side goes with which.
  96. X
  97. XI currently have 130 double sided 90 min tapes.  What I have done
  98. Xis number them sequentially in approximately the order I record 
  99. Xthem.  Thus, when I record a new tape it receives the next highest
  100. Xnumber.  I find this very helpful in my searches to discover which
  101. Xtape I am missing, or even to realize I am missing a tape.  By
  102. Xkeeping a record of the tapes I can often remember where I last
  103. Xhad a particular tape or who I lent it to.
  104. X
  105. XIn order to find a particular album by artist I wrote this 
  106. Xprogram.  It keeps a record of tapes and can print out a list
  107. Xof sides organized by tape number or by Alphabetized artist
  108. Xname.  It will even alphabetize by last name of the artist,
  109. Xif used correctly (or to ignore a leading 'the').
  110. X
  111. XI wrote it on a PC and then transported it to UNIX.  To transfer
  112. Xfrom one system to another edit header.h.  There are some other
  113. Xoptions you can set in there.
  114. X
  115. X
  116. XFILES:
  117. X------------------------------------------------
  118. X
  119. XMakefile    | Unix makefile, doesn't work on PC
  120. X
  121. Xheader.h    | Header file
  122. Xmain.c        | Main programming functions
  123. Xalpha.c        | Functions to do with alphabetizing
  124. Xio.c        | Functions that have to do with i/o
  125. X
  126. XTAPE.EXE    | PC exe file; don't try to run elsewhere!
  127. Xtape.prj    | project file for TURBO C
  128. Xdave.t        | test tape file (actually my list of tapes :-)
  129. X
  130. XDescription of some of the commands:
  131. X-----------------------------------------------------------
  132. X
  133. XNote:    These command Names are the default ones.  They can be changed
  134. X    by editing header.h
  135. X
  136. X'r'    Read in data from a file.  Use with files created with this program.
  137. X    Can also be done from command line, eg:
  138. X    tape data.t
  139. X
  140. X'a'    Add tape.  Entering 0 for a tape number exits.  Hitting return for 
  141. X    tape number adds the number or the last tape in memory plus one.
  142. X    A title for a side is usually in the format:
  143. X
  144. X    Artist Name:Album Title
  145. X
  146. X    Where the ':' is the delimiter (can be changed in header.h).
  147. X    If the album has no title, or is not appropriate, delete from
  148. X    the colon on.
  149. X
  150. X's'    Save data base.  Files usually end in '.t'
  151. X
  152. X'w'    Write data base.  Save as above.
  153. X
  154. X'e'    Edit.  Self explanatory.  Allows changing of a particular tape side
  155. X    or number.
  156. X
  157. X'l'    List tapes.
  158. X
  159. X'L'    List tapes, but do not alpha decode (see 'Correct Alpha Mismatch')
  160. X
  161. X'p'    Print file.  Choice of two output formats (at current time)
  162. X
  163. X'D'    Delete tape.
  164. X
  165. X'C'    Clear all tapes.
  166. X
  167. X'o'    Order tapes in numerical order or alphabetized to side 1.
  168. X
  169. X'A'    Correct alpha mismatch.  In order that the tape side may 
  170. X    be alphabetized according to a part of the title other than
  171. X    the first word, this command will rearrange the title so
  172. X    that the program will do this.  For example a title such
  173. X    as:
  174. X
  175. X    John Smith:I Bite the Songs
  176. X
  177. X    Would be properly changed to:
  178. X
  179. X    Smith|John:I Bite the Songs
  180. X
  181. X    Thus the '|' symbol indicates that the artist name should be
  182. X    rearranged to form the actual name.  Whenever any title is printed
  183. X    (except with 'L' above) the program will 'alpha-decode' the title
  184. X    which basically places any text between the '|' and the first ':'
  185. X    (these can also be changed from default in header.h) at the front
  186. X    of the line, followed by a space, the text previous to the '|',
  187. X    and if the encoded title has a ':', everything following the ':'.
  188. X
  189. X    To encode, select the command 'A', specify how you wish to search
  190. X    for your tapes you wish to change.  Once selected program will
  191. X    enter the 'correct' mode.  Use the left arrow and right arrow in
  192. X    MSDOS, and 'h' and 'l' in UNIX to move cursor and position it 
  193. X    underneath the 'space' you wish to flip the artist name around.
  194. X    Hit space bar to insert '|' and flip name, return to make no
  195. X    change, and 'Q' to exit.
  196. X
  197. X    Example:
  198. X
  199. X    To alphabetize -
  200. X    The Music of Cosmos
  201. X
  202. X    to Cosmos move the cursor to the space between 'of' and 'Cosmos'
  203. X    and hit the space bar.
  204. X
  205. X    To produce:
  206. X    Cosmos|The Music of
  207. X
  208. X'Q'    Quit.
  209. X
  210. X-----------------------------------------------------------
  211. X
  212. XDisclaimer:  Use at your own risk.  Any problems you have with this
  213. X    program are yours, and are not my responsibility.  If you have 
  214. X    fixes or improvements send them to me at:
  215. X
  216. X    bleckmd@jacobs.cs.orst.edu
  217. SHAR_EOF
  218. chmod 0640 README.DOC || echo "restore of README.DOC fails"
  219. set `wc -c README.DOC`;Sum=$1
  220. if test "$Sum" != "4574"
  221. then echo original size 4574, current size $Sum;fi
  222. fi
  223. if test -f alpha.c; then echo "File alpha.c exists"; else
  224. echo "x - extracting alpha.c (Text)"
  225. sed 's/^X//' << 'SHAR_EOF' > alpha.c &&
  226. X#include "header.h"
  227. X
  228. Xint nindex(s, c)    /*returns the position of the char c in the string s*/
  229. Xchar *s, c;
  230. X{
  231. Xint n;
  232. X
  233. X    n=0;
  234. X
  235. X    while(*s!=c && *s!='\0')
  236. X    {
  237. X    n++;
  238. X    s++;
  239. X    }
  240. X
  241. X    if (*s=='\0')
  242. X    return(-1);    /* -1 if not found */
  243. X
  244. X    return(n);
  245. X}
  246. X
  247. Xint allblank(s)    /* returns TRUE if no chars in string s */
  248. Xchar *s;
  249. X{
  250. X    while (*s!='\0')
  251. X    if (!isspace(*s++))
  252. X        return FALSE;
  253. X
  254. X    return TRUE;
  255. X}
  256. X
  257. Xchar *decode(p2, p1)    /*undoes alpha coding*/
  258. Xchar *p2, *p1;
  259. X{
  260. Xint vb, colen;
  261. X
  262. X    if ((vb=nindex(p1, VERT_BAR))!=-1)
  263. X    {
  264. X    colen=nindex(p1+vb, COLEN);
  265. X    colen=(colen!=-1) ? colen+vb : strlen(p1);
  266. X    strncpy(p2, p1+vb+1, colen-vb-1);
  267. X    p2[colen-vb-1]=' ';
  268. X    p2[colen-vb]='\0';
  269. X    strncat(p2, p1, vb);
  270. X    strcat(p2, p1+colen);
  271. X    }
  272. X    else
  273. X    strcpy(p2, p1);
  274. X
  275. X    return(p2);
  276. X}
  277. X
  278. Xvoid alpha_out(fp, t, count)
  279. XFILE *fp;
  280. Xstruct tape *t[];
  281. Xint count;
  282. X{
  283. Xint t_mark[MAX_NUM_TAPES][2], least_num, least_side, a, b;
  284. Xstring tmp;
  285. X
  286. X/* we need to fprint to fp an alphabetized list of tiles, and */
  287. X/* of course we do this inefficiently ;-).  We keep track of  */
  288. X/* what titles we have printed out so far in t_mark[] and     */
  289. X/* then print out the least of the remaining tapes.           */
  290. X
  291. X    for(a=0; a<count; a++)
  292. X    t_mark[a][0]=t_mark[a][1]=0;
  293. X
  294. X    for(;;)
  295. X    {
  296. X    least_num=count;    /*indicates we don't have least yet*/
  297. X    least_side=1;
  298. X    for(a=0; a<count; a++)         /* a == tape number */
  299. X        for(b=1; b<=2; b++)        /* b == side        */
  300. X
  301. X             if(!t_mark[a][b-1] &&
  302. X            (least_num==count ||
  303. X                strcmp(Sx(t[a],b), Sx(t[least_num],least_side))<0))
  304. X        {
  305. X            least_num=a;
  306. X            least_side=b;
  307. X        }
  308. X
  309. X        if (least_num==count)    /* we must be done with the lot */
  310. X        break;        /* so exit the for(;;) */
  311. X
  312. X        if (!allblank(Sx(t[least_num], least_side)))
  313. X            fprintf(fp, "Tape %-4d Side %c: %s\n", t[least_num]->num,
  314. X            SIDECHAR(least_side),
  315. X                decode(tmp, Sx(t[least_num],least_side)));
  316. X
  317. X        t_mark[least_num][least_side-1]=1;    /* mark this one as printed */
  318. X    }
  319. X}
  320. X
  321. Xint mvcur(cur, new)    /*returns new cursor position*/
  322. Xint cur, new;
  323. X{
  324. Xint a;
  325. X
  326. X    if (new < cur)
  327. X    for(a=cur; a>new; a--)
  328. X        BACKSPACE();
  329. X
  330. X    if (new > cur)
  331. X    for(a=cur; a<new; a++)
  332. X        putchar(SPACE);
  333. X
  334. X    return new;
  335. X}
  336. X
  337. Xint correct(s)    /*returns 1 if changes made, 0 if not*/
  338. X        /*-1 if Quit is incountered*/
  339. Xchar *s;
  340. X{
  341. Xint curpos, colenpos, a, b;
  342. Xstring tmp;
  343. X
  344. X#ifdef MS_DOS
  345. X    printf("\nUse <- and -> , hit space to insert a '%c'\n", VERT_BAR);
  346. X    printf("Return for no change; Q to quit\n\n");
  347. X
  348. X    fflush(stdin);
  349. X    printf("%s\n",  s);
  350. X
  351. X    colenpos=(a=nindex(s, COLEN))==-1 ? strlen(s) : a ;
  352. X
  353. X    if ((curpos=nindex(s, SPACE))==-1 || colenpos<curpos)
  354. X    {
  355. X    printf("No spaces found - No changes made.\n");
  356. X    return 0;
  357. X    }
  358. X
  359. X    mvcur(0, curpos);
  360. X
  361. X    do {
  362. X    while(!kbhit())
  363. X        ;
  364. X
  365. X        if ((b=getch())=='\0')    /*a function key is hit*/
  366. X        b=getch()+128;
  367. X
  368. X    if (b=='Q')
  369. X        return(-1); 
  370. X
  371. X        if (b==205)    /* -> */
  372. X        {
  373. X        a=nindex(s+curpos+1, SPACE)+curpos+1;
  374. X        if (a!=-1 && a<colenpos)
  375. X        curpos=mvcur(curpos, a);
  376. X    }
  377. X
  378. X        if (b==203)    /* <- */
  379. X    {
  380. X        b=curpos;    /* last known space */
  381. X        a=0;
  382. X        while ((a=nindex(s+a+1, SPACE)+a+1)<curpos && a!=-1)
  383. X        b=a;
  384. X
  385. X            curpos=mvcur(curpos, b);  /**/
  386. X    }
  387. X
  388. X        if (b==SPACE)    /* Alpha encode word */
  389. X    {
  390. X        a=nindex(s+curpos, COLEN);
  391. X        strncpy(tmp, s+curpos+1,
  392. X             (a=(a!=-1)?a+curpos:strlen(s)) - curpos - 1);
  393. X        tmp[a-curpos-1]=VERT_BAR;
  394. X        tmp[a-curpos]='\0';
  395. X            strncat(tmp, s, curpos);
  396. X        strcat(tmp, s+a);
  397. X
  398. X        strcpy(s, tmp);
  399. X        printf("\n%s\n", s);
  400. X        return(1);
  401. X    }
  402. X
  403. X    } while (b!=CR);
  404. X
  405. X    return 0;    /* CR hit, no changes made */
  406. X#else
  407. X    printf("\nUse '%c' and '%c', hit space to insert a '%c'\n", 
  408. X        LEFTCHAR, RIGHTCHAR, VERT_BAR);
  409. X    printf("Return for no change; Q to quit\n\n");
  410. X
  411. X    noecho();
  412. X    cbreak();
  413. X
  414. X    fflush(stdin);
  415. X    printf("%s\n",  s);
  416. X
  417. X    colenpos=(a=nindex(s, COLEN))==-1 ? strlen(s) : a ;
  418. X
  419. X    if ((curpos=nindex(s, SPACE))==-1 || colenpos<curpos)
  420. X    {
  421. X    printf("No spaces found - No changes made.\n");
  422. X    echo();
  423. X    nocbreak();
  424. X    return 0;
  425. X    }
  426. X
  427. X    mvcur(0, curpos);
  428. X
  429. X    do {
  430. X    b=getchar();
  431. X
  432. X        if (b==RIGHTCHAR)    /* -> */
  433. X        {
  434. X        a=nindex(s+curpos+1, SPACE)+curpos+1;
  435. X        if (a!=-1 && a<colenpos)
  436. X        curpos=mvcur(curpos, a);
  437. X    }
  438. X
  439. X        if (b==LEFTCHAR)    /* <- */
  440. X    {
  441. X        b=curpos;    /* last known space */
  442. X        a=0;
  443. X        while ((a=nindex(s+a+1, SPACE)+a+1)<curpos && a!=-1)
  444. X        b=a;
  445. X
  446. X            curpos=mvcur(curpos, b);  /**/
  447. X    }
  448. X
  449. X    if (b=='Q')     /* Quit */
  450. X    {
  451. X        echo();
  452. X        nocbreak();
  453. X        return(-1);
  454. X    }
  455. X
  456. X        if (b==SPACE)    /* Alpha encode word */
  457. X    {
  458. X        a=nindex(s+curpos, COLEN);
  459. X        strncpy(tmp, s+curpos+1,
  460. X             (a=(a!=-1)?a+curpos:strlen(s)) - curpos - 1);
  461. X        tmp[a-curpos-1]=VERT_BAR;
  462. X        tmp[a-curpos]='\0';
  463. X            strncat(tmp, s, curpos);
  464. X        strcat(tmp, s+a);
  465. X
  466. X        strcpy(s, tmp);
  467. X        printf("\n%s\n", s);
  468. X
  469. X        echo();
  470. X        nocbreak();
  471. X        return(1);
  472. X    }
  473. X
  474. X    } while (b!=CR);
  475. X
  476. X    echo();
  477. X    nocbreak();
  478. X    return 0;    /* CR hit, no changes made */
  479. X#endif
  480. X}
  481. X
  482. SHAR_EOF
  483. chmod 0640 alpha.c || echo "restore of alpha.c fails"
  484. set `wc -c alpha.c`;Sum=$1
  485. if test "$Sum" != "5018"
  486. then echo original size 5018, current size $Sum;fi
  487. fi
  488. if test -f dave.t; then echo "File dave.t exists"; else
  489. echo "x - extracting dave.t (Text)"
  490. sed 's/^X//' << 'SHAR_EOF' > dave.t &&
  491. X1
  492. XJarre|Jean-Michel:Oxygene
  493. XJarre|Jean-Michel:Equinoxe
  494. X2
  495. XEurithmics:1984
  496. XJarre|Jean-Michel:Les Chants Magnetiques
  497. X3
  498. XMen Without Hats:Rhythem of Youth
  499. XTangerine Dream:Warsaw in the Sun
  500. X4
  501. XJHS Band
  502. XTangerine Dream:Wavelength
  503. X5
  504. XJarre|Jean-Michel:L'Essential Jean-Michel Jarre
  505. XTangerine Dream:Flashpoint
  506. X6
  507. XTangerine Dream:Firestarter
  508. XTangerine Dream:Exit
  509. X7
  510. XJarre|Jean-Michel:Zoolook
  511. XTangerine Dream:Cyclone
  512. X8
  513. XJethro Tull:Under Wraps
  514. XDalek, I Love You
  515. X9
  516. XNuman|Gary:Replicas
  517. XNuman|Gary:Pleasure Principle
  518. X10
  519. XDepeche Mode:Some Great Reward
  520. XDepeche Mode:Black Celebration
  521. X11
  522. XTalking Heads:Fear of Music
  523. XGarrison|Michael:Prisms
  524. X12
  525. XTears for Fears:Various Remix Tape #1
  526. X
  527. X13
  528. XGraduate:Acting My Age
  529. XMcKenzie|Bob and Doug
  530. X14
  531. XTangerine Dream:Stratosfear
  532. XGarrison|Michael:Point of Inpact
  533. X15
  534. XTangerine Dream:Poland
  535. X
  536. X16
  537. XTangerine Dream:Tangram
  538. XTangerine Dream:Quichette
  539. X17
  540. XJones|Howard:Human's Lib
  541. XDream Academy|The
  542. X18
  543. XFrankie Goes to Hollywood:Welcome to the Pleasure Dome
  544. X
  545. X19
  546. XJones|Howard:Dream Into Action
  547. XJones|Howard:The 12" Album
  548. X20
  549. XLive Aid
  550. XJohn Valby
  551. X21
  552. XBerlin:Love Life
  553. XBerlin:Pleasure Victim
  554. X22
  555. XDolby|Thomas:Rare Remixes
  556. XManheim Steamroller:Freshaire III
  557. X23
  558. XAnderson|Laurie:United States
  559. X
  560. X24
  561. XAnderson|Laurie:United States
  562. X
  563. X25
  564. XAnderson|Laurie:United States
  565. X
  566. X26
  567. XModern English:Ricochet Days
  568. XDead or Alive:Youthquake
  569. X27
  570. XJethro Tull:Thick as a Brick
  571. XDepeche Mode:People are People
  572. X28
  573. XTears for Fears:Songs From the Big Chair
  574. XTears for Fears:The Hurting
  575. X29
  576. XJethro Tull:Stormwatch
  577. XVangelis:China
  578. X30
  579. XTalking Heads:Little Creatures
  580. XVega|Suzanne
  581. X31
  582. XTalking Heads:Speaking in Tounges
  583. XTalking Heads:More Songs About Buildings and Food
  584. X32
  585. XDepeche Mode:Speak and Spell
  586. XDepeche Mode:A Broken Frame
  587. X33
  588. XDepeche Mode:Constuction Time Again
  589. X
  590. X34
  591. XJones|Howard:Remix Tape 1
  592. X
  593. X35
  594. XJones|Howard:San Deigo Interview
  595. XDolby|Thomas:The Flat Earth
  596. X36
  597. XJarre|Jean-Michel:Rendez-Vous
  598. XManheim Steamroller:Fresh Aire VI
  599. X37
  600. XU2:Unforgetable Fire
  601. XU2:War
  602. X38
  603. XAnderson|Laurie:Mister Heartbreak
  604. XAnderson|Laurie:Home of the Brave
  605. X39
  606. XSimple Minds:Life in a Day
  607. XEcho and the Bunnymen:Heaven up Here
  608. X40
  609. XJethro Tull:Aqualung
  610. XSpinal Tap|Soundtrack to This is
  611. X41
  612. XGarrison|Michael:Eclipse
  613. XTangerine Dream:White Eagle
  614. X42
  615. XReal Life:Flame
  616. XReal Life:Heartland
  617. X43
  618. XU2:Boy
  619. XBowie|David:Let's Dance
  620. X44
  621. XRepo Man|Soundtrack to
  622. XIdol|Billy:Whiplash Smile
  623. X45
  624. XAltered Images:Pinky Blue
  625. XCure|The:Concert-The Cure Live
  626. X46
  627. XTangerine Dream:70-80 (tape 1)
  628. X
  629. X47
  630. XTangerine Dream:70-80 (tape 2)
  631. X
  632. X48
  633. XKitaro:Silk Road I
  634. XKitaro:Silk Road II
  635. X49
  636. XKitaro:Full Moon Story
  637. XKitaro:Astral Voyage
  638. X50
  639. XKitaro:In Person
  640. XKitaro:Asia Tour Super Live
  641. X51
  642. XKitaro:Tunhuang
  643. XAshra:Blackouts
  644. X52
  645. XTangerine Dream:Le Parc
  646. XTangerine Dream:Heartbreakers
  647. X53
  648. XDire Straits:Brothers in Arms
  649. X
  650. X54
  651. XJarre|Jean-Michel:The Concerts in China
  652. X
  653. X55
  654. XNuman|Gary:The Fury
  655. XNuman|Gary:Strange Charm
  656. X56
  657. XSimon and Garfunkel:Greatest Hits
  658. XVarious CD Samples
  659. X57
  660. XABC:How to be a Zillionaire
  661. XSimple Minds: Once Upon a Time
  662. X58
  663. XRush:Power Windows
  664. XVan Halen
  665. X59
  666. XFlock of Seagulls
  667. XFlock of Seagulls:Listen
  668. X60
  669. XSmiths|The
  670. XSmiths|The:Meat is Murder
  671. X61
  672. XU2:Under a Blood Red Sky
  673. XU2:October
  674. X62
  675. XMozart:Symphony 41 & 40
  676. X
  677. X63
  678. XVollenwieder|Andreas:Behind the Gardens...
  679. XVollenwieder|Andreas:Cavern Magica
  680. X64
  681. XWinston|George:December
  682. XWindom Hill:Sampler '84
  683. X65
  684. XGreenpeace
  685. X
  686. X66
  687. XDire Straits:Alchemy - Live
  688. X
  689. X67
  690. XIdol|Billy
  691. XIdol|Billy:Rebel Yell
  692. X68
  693. XThompson Twins:Here's to Future Days
  694. XBowie|David:Tonight
  695. X69
  696. XTangerine Dream:Green Desert
  697. XTangerine Dream:Legend
  698. X70
  699. XEtosha:Private Music in the Land of Dry Water
  700. XCosmos|The Music of
  701. X71
  702. XDif Juz:Who Says So
  703. XLadyhawk
  704. X72
  705. XBush|Kate:Hounds of Love
  706. XBush|Kate:The Dreaming
  707. X73
  708. XArt of Noise|The:Into Battle with the Art of Noise
  709. XArt of Noise|The:Who's Afraid of the Art of Noise?
  710. X74
  711. XArt of Noise|The:Various Remixes
  712. XThis Mortal Coil:It'll End in Tears
  713. X75
  714. XTears for Fears:Memories
  715. XTears for Fears:Remixes Tape 2
  716. X76
  717. XDalis Car:The Waking Hour
  718. XKarn|Mick:Titles
  719. X77
  720. XNuman|Gary:Warriors
  721. XNuman|Gary:Beserker
  722. X78
  723. XJethro Tull:Songs from the Woods
  724. XJethro Tull:Minstrel in the Gallery
  725. X79
  726. XJethro Tull:M.U. The Best of Jethro Tull
  727. XJethro Tull:A
  728. X80
  729. XCocteau Twins:Head Over Heals
  730. XCocteau Twins:Treasure
  731. X81
  732. XNuman and the Tubeway Army|Gary:First Album
  733. XNuman|Gary:Telekon
  734. X82
  735. XNuman|Gary:I, Assassin
  736. XNuman|Gary:Dance
  737. X83
  738. XAha:Hunting High and Low
  739. XSigue Sigue Sputnik:Faunt It
  740. X84
  741. XGenesis:Invisible Touch
  742. XGabriael|Peter:So
  743. X85
  744. XStawberry Switchblade
  745. XStawberry Switchblade:(12")
  746. X86
  747. XCour Field|The
  748. XModern English:Ricochet Days
  749. X87
  750. XUnderground Mixes
  751. XToy Dolls:Dig That Grove Baby
  752. X88
  753. XCure|The:Standing on a Beach - The Singles
  754. X
  755. X89
  756. XSkinny Puppy:Bites
  757. XSkinny Puppy:Mind:The Perpetual Intercourse
  758. X90
  759. XBauhaus:1979-1983
  760. X
  761. X91
  762. XJones|Howard:One to One
  763. XBerlin:Count Three and Pray
  764. X92
  765. XManheim Streamroller:Fresh Aire I
  766. XVangelis:Albedo 0.39
  767. X93
  768. XFrankie Goes to Hollywood:Liverpool
  769. XPop|Iggy:Blah-Blah-Blah
  770. X94
  771. XWindom Hill|An Evening With
  772. X4AD Various
  773. X95
  774. XSmiths|The:The Queen is Dead
  775. X
  776. X96
  777. XDead Can Dance
  778. XDead Can Dance:Spleen and Ideal
  779. X97
  780. XTears for Fears:Penthouse/Omni Magazine Concert
  781. X
  782. X98
  783. XSiouxsie and the Banshies:Nocturne
  784. X
  785. X99
  786. XCindytalk:Camouflage Heart
  787. XXymox|Clan of:Medusa
  788. X100
  789. XThis Mortal Coil:Filigree and Shadow
  790. X
  791. X101
  792. XBolshoi|The:Friends
  793. XCure|The:The Head on the Door
  794. X102
  795. XDead Kennedys:Fresh Fruit for Rotten Vegetables
  796. XSuicidal Tendecies
  797. X103
  798. XSiouxsie and the Banshies:Through the Looking Glass
  799. XSiouxsie and the Banshies:Tinderbox
  800. X104
  801. XTrisomie 21:Chapter IV
  802. XSisters of Mercy:Floodland
  803. X105
  804. XNuman|Gary:White Noise
  805. X
  806. X106
  807. XAnderson|Laurie:Home of the Brave Interview
  808. X
  809. X107
  810. XWire:The Ideal Copy
  811. XLove and Rockets:Earth Sun Moon
  812. X108
  813. XLonely is an Eyesore
  814. XRobyn Hitchcock:Element of Light
  815. X109
  816. XNuman|Gary:Exhibition
  817. X
  818. X110
  819. XDif Juz:Extractions
  820. XKarn|Mick:Dreanms of Reason
  821. X111
  822. XBreathless:Three Times and Waving
  823. XBreathless:The Glass Bead Game
  824. X112
  825. XNuman|Gary:Exhibition
  826. X
  827. X113
  828. XNuman|Gary:Exhibition
  829. XNuman|Gary:Exhibition (et al)
  830. X114
  831. XNelson|Bill:The Love that Whirls
  832. XNelson|Bill:La Belle et la Bete
  833. X116
  834. XByrne|Brian Eno and David:My Life in the Bush with Ghosts
  835. XBudd|Harold:The Pavilion of Dreams
  836. X117
  837. XRoxy Music:Avalon
  838. X
  839. X118
  840. XM:Pop Muzic
  841. XNegativeland:Escape from Noise
  842. X119
  843. XTalking Heads:Remain in Light
  844. XGabrial|Peter:Security
  845. X120
  846. XCheese
  847. X
  848. X121
  849. XBush|Kate:Never for Ever
  850. X
  851. SHAR_EOF
  852. chmod 0640 dave.t || echo "restore of dave.t fails"
  853. set `wc -c dave.t`;Sum=$1
  854. if test "$Sum" != "6076"
  855. then echo original size 6076, current size $Sum;fi
  856. fi
  857. if test -f header.h; then echo "File header.h exists"; else
  858. echo "x - extracting header.h (Text)"
  859. sed 's/^X//' << 'SHAR_EOF' > header.h &&
  860. X/*header.h                */
  861. X/*include file for tape sorting program    */
  862. X/*by David Bleckmann            */
  863. X
  864. X/*#define MS_DOS    /*define if on compiling on turbo C*/
  865. X
  866. X#include <stdio.h>
  867. X#include <ctype.h>
  868. X
  869. X#ifdef MS_DOS
  870. X#include <string.h>
  871. X#include <conio.h>
  872. X#else
  873. X/*for system V you may need to change <strings.h> to <string.h>*/
  874. X#include <strings.h>
  875. X#include <curses.h>
  876. X#endif
  877. X
  878. X#define SIDEAB      /*define if sides to be accessed as A or B rather*/
  879. X            /*than side 1 or 2.            */
  880. X
  881. X/* The following are used as defines so that the user can set up */
  882. X/* the program as he/she would like, i.e. change the command key */
  883. X/* letters, etc.  It is permissible to make changes, but     */
  884. X/* certainly isn't necesarry.                      */
  885. X
  886. X
  887. X#define MAX_NUM_TAPES 300
  888. X#define STR_LEN 80
  889. X#define SCRHT 11    /* number of tapes that fits on one screen */
  890. X
  891. X#define VERT_BAR '|'
  892. X#define COLEN    ':'
  893. X#define SPACE    ' '
  894. X#ifndef MS_DOS
  895. X#define CR    '\12'
  896. X#else
  897. X#define CR    '\15'
  898. X#endif
  899. X
  900. X/* COMMAND DEFINES */
  901. X#define READCOM     'r'
  902. X#define ADDCOM          'a'
  903. X#define WR1COM      's'
  904. X#define WR2COM         'w'
  905. X#define EDITCOM        'e'
  906. X#define LISTCOM     'l'
  907. X#define LIST2COM    'L'
  908. X#define PRINTCOM    'p'
  909. X#define DELCOM        'D'
  910. X#define CLEARCOM    'C'
  911. X#define RECOVCOM    'R'
  912. X#define ORDCOM        'o'
  913. X#define ALPHACOM    'A'
  914. X#define QUITCOM        'Q'
  915. X
  916. X#ifndef MS_DOS
  917. X/*LEFTCHAR and RIGHTCHAR are used in the Unix version of ALPHACOM*/
  918. X#define LEFTCHAR 'h'
  919. X#define RIGHTCHAR 'l'
  920. X#endif
  921. X
  922. X/* All further lines should probably not be changed    */
  923. X/*--------------------------------------------------------------------*/
  924. X
  925. X#ifndef TRUE    /* sometimes not defined */
  926. X#define TRUE 1
  927. X#endif
  928. X#ifndef FALSE
  929. X#define FALSE 0
  930. X#endif
  931. X
  932. X
  933. X#ifdef SIDEAB
  934. X#define SIDECHAR(pdq) ((pdq)!=2?'A':'B')
  935. X#define SIDE1CHAR 'A'
  936. X#define SIDE2CHAR 'B'
  937. X#else
  938. X#define SIDECHAR(pdq) ((pdq)!=2?'1':'2')
  939. X#define SIDE1CHAR '1'
  940. X#define SIDE2CHAR '2'
  941. X#endif
  942. X
  943. X#ifdef MS_DOS
  944. X#define BACKSPACE() gotoxy(wherex()-1, wherey())
  945. X#else
  946. X#define BS    '\10'
  947. X#define BACKSPACE() putchar(BS)
  948. X
  949. X/* For some reason TC's strncmp is strnicmp, thus the following macro */
  950. X#define strnicmp(aaa, bbb, ccc) strncmp(aaa, bbb, ccc)
  951. X#endif
  952. X
  953. X/* Side X macro; refers to the side yyy in the  struct tape *xxx */
  954. X#define Sx(xxx, yyy) ((yyy)==2 ? (xxx)->s2 : (xxx)->s1)
  955. X
  956. Xtypedef char string[STR_LEN];
  957. X
  958. Xstruct tape {
  959. X    int num;
  960. X    string s1;
  961. X    string s2;
  962. X};
  963. X
  964. X
  965. SHAR_EOF
  966. chmod 0640 header.h || echo "restore of header.h fails"
  967. set `wc -c header.h`;Sum=$1
  968. if test "$Sum" != "2282"
  969. then echo original size 2282, current size $Sum;fi
  970. fi
  971. if test -f io.c; then echo "File io.c exists"; else
  972. echo "x - extracting io.c (Text)"
  973. sed 's/^X//' << 'SHAR_EOF' > io.c &&
  974. X#include "header.h"
  975. X
  976. Xchar *crstrip(s)    /*strips off a '\n' off the end of a string if */
  977. Xchar *s;           /*there is one.                       */
  978. X{
  979. Xint a;
  980. X
  981. X    if (s != NULL  &&  s[a=strlen(s)-1] == '\n')
  982. X    s[a]= '\0';
  983. X
  984. X    return s;
  985. X}
  986. X
  987. Xint get_tape(t, fname)    /*returns count or -1 if error*/
  988. Xstruct tape *t[];
  989. Xchar *fname;
  990. X{
  991. XFILE *fp;
  992. Xint a, b;
  993. Xstring tmp;
  994. Xchar *malloc();
  995. X
  996. X    if ((fp=fopen(fname, "r"))==NULL)
  997. X    {
  998. X    fprintf(stderr, "can't open file\n");
  999. X    return(-1);
  1000. X    }
  1001. X    for (a=0; t[a]!=NULL; a++)
  1002. X    {
  1003. X    if (fgets(tmp, 80, fp)==NULL)    /* NULL implies EOF */
  1004. X    {
  1005. X        fclose(fp);
  1006. X        return(a);
  1007. X    }
  1008. X
  1009. X        if((t[a]->num=atoi(tmp)) == 0)
  1010. X    {
  1011. X        fprintf(stderr, "\"%s\" not tape number\n", tmp);
  1012. X        fclose(fp);
  1013. X        return(-1);
  1014. X    }
  1015. X    crstrip(fgets(t[a]->s1, 80, fp));
  1016. X    crstrip(fgets(t[a]->s2, 80, fp));
  1017. X    }
  1018. X
  1019. X    for(; a<MAX_NUM_TAPES && fgets(tmp, 80, fp)!=NULL; a++)
  1020. X    {
  1021. X        if((b=atoi(tmp)) == 0)
  1022. X    {
  1023. X        t[a]=NULL;
  1024. X        fprintf(stderr, "\"%s\" not tape number\n", tmp);
  1025. X        fclose(fp);
  1026. X        return(-1);
  1027. X    }
  1028. X    t[a]=(struct tape *) malloc(sizeof(struct tape));
  1029. X    t[a]->num=b;
  1030. X    crstrip(fgets(t[a]->s1, 80, fp));
  1031. X    crstrip(fgets(t[a]->s2, 80, fp));
  1032. X    }
  1033. X/* found EOF */
  1034. X    fclose(fp);
  1035. X    return(a);
  1036. X}
  1037. X
  1038. X
  1039. Xint save_tape(t, fname, count)
  1040. Xstruct tape *t[];
  1041. Xchar *fname;
  1042. Xint count;
  1043. X{
  1044. XFILE *fp;
  1045. Xint a;
  1046. X
  1047. X    if ((fp=fopen(fname, "w"))==NULL)
  1048. X    {
  1049. X    fprintf(stderr, "can't open file\n");
  1050. X    return(-1);
  1051. X    }
  1052. X    for(a=0; a<count; a++)
  1053. X    fprintf(fp, "%d\n%s\n%s\n", t[a]->num, t[a]->s1, t[a]->s2);
  1054. X    fclose(fp);
  1055. X    return(a);
  1056. X}
  1057. SHAR_EOF
  1058. chmod 0640 io.c || echo "restore of io.c fails"
  1059. set `wc -c io.c`;Sum=$1
  1060. if test "$Sum" != "1518"
  1061. then echo original size 1518, current size $Sum;fi
  1062. fi
  1063. if test -f main.c; then echo "File main.c exists"; else
  1064. echo "x - extracting main.c (Text)"
  1065. sed 's/^X//' << 'SHAR_EOF' > main.c &&
  1066. X#include "header.h"
  1067. X
  1068. X#define DB(xxx) /* fprintf(stderr, "Debug #%d", (xxx)); fflush(stdout); fflush(stderr) /**/
  1069. X
  1070. Xvoid greeting()
  1071. X{
  1072. X#ifdef MS_DOS
  1073. X    clrscr();
  1074. X#else
  1075. X    system("clear");
  1076. X#endif
  1077. X    printf("\n");
  1078. X    printf("Tape organizer 0.0 ---   By David Bleckmann \n ");
  1079. X    printf("\n");
  1080. X    printf("Created 1988 \n");
  1081. X    printf("\n");
  1082. X    printf("\n");
  1083. X    printf("Use/modify however you wish, but please give me credit for\n");
  1084. X    printf("my work.\n");
  1085. X    /* and excuse me for my "ammature" programming skills :-) */
  1086. X    printf("\n");
  1087. X    printf("Send all criticizism/improvements to me at my UUCP/internet address:\n");
  1088. X    printf("\n");
  1089. X    printf("\tbleckmd@jacobs.cs.orst.edu\n");
  1090. X    printf("\t{tektronix, hp-pcd}!orstcs!jacobs.cs.orst.edu!bleckmd\n");
  1091. X    printf("\n");
  1092. X    printf("\n");
  1093. X    printf("Use 'H', 'h', or '?' for help menu\n\n");
  1094. X
  1095. X}
  1096. X
  1097. Xmain(argc, argv)
  1098. Xint argc;
  1099. Xchar *argv[];
  1100. X{
  1101. Xstruct tape *t[MAX_NUM_TAPES];
  1102. Xint a, b, c, count;
  1103. Xstring fname, tmp, tmp1, tmp2;
  1104. Xint save_tape(), get_tape(), correct();
  1105. Xvoid clr_to_null(), alpha_out();
  1106. Xchar *decode(), *malloc();
  1107. Xextern int allblank();
  1108. X
  1109. XFILE *fp;
  1110. X
  1111. X    count=0;
  1112. X
  1113. X
  1114. X#ifndef MS_DOS
  1115. X    initscr();
  1116. X#endif
  1117. X
  1118. X    for (a=0; a<MAX_NUM_TAPES; a++)
  1119. X    t[a]= NULL;            /*clear all tape elements to NULL*/
  1120. X
  1121. X
  1122. X    switch(argc)
  1123. X    {
  1124. X    case 1:
  1125. X        greeting();
  1126. X        break;
  1127. X
  1128. X    case 2:
  1129. X        if ((count=get_tape(t, argv[1])) == -1)  /* return -1 if error */
  1130. X        {
  1131. X        greeting();
  1132. X        fprintf(stderr, "file error\n%s not loaded.\n", argv[1]);
  1133. X        }
  1134. X        else
  1135. X        {
  1136. X        greeting();
  1137. X        printf("File %s Loaded\n", argv[1]);
  1138. X            }
  1139. X        break;
  1140. X
  1141. X    default:
  1142. X        fprintf(stderr,
  1143. X        "Usage: %s [tapefile]\n where tapefile was created using %s\n",
  1144. X        argv[0], argv[0]);
  1145. X
  1146. X#ifndef MS_DOS
  1147. X        nocbreak();
  1148. X        endwin();
  1149. X#endif
  1150. X        exit(1);
  1151. X    }
  1152. X
  1153. X    for(;;)
  1154. X    {
  1155. X    printf("\nCommand:");
  1156. X    gets(tmp);
  1157. X
  1158. X    switch (*tmp)  {
  1159. X
  1160. X    case '?':
  1161. X    case 'h':
  1162. X    case 'H':    /*help command! (yes we have one)*/
  1163. X        printf("command list:\n");
  1164. X        printf("\t%c: read in file\n", READCOM);
  1165. X        printf("\t%c,%c: write to file\n", WR1COM, WR2COM);
  1166. X        printf("\t%c: add tape data\n", ADDCOM);
  1167. X        printf("\t%c: edit tape\n", EDITCOM);
  1168. X            printf("\t%c: list tapes\n", LISTCOM);
  1169. X        printf("\t%c: print out tapes\n", PRINTCOM);
  1170. X        printf("\t%c: delete a tape\n", DELCOM);
  1171. X            printf("\t%c: clear all tapes (careful!)\n", CLEARCOM);
  1172. X        printf("\t%c: order tapes\n", ORDCOM);
  1173. X        printf("\t%c: correct alpha mismatch\n", ALPHACOM);
  1174. X        printf("\t%c: quit\n", QUITCOM);
  1175. X        break;
  1176. X
  1177. X    case READCOM:
  1178. X        printf("file to read from:");
  1179. X        gets(fname);
  1180. X        if ((a=get_tape(t, fname)) == -1)  /* returns -1 on error */
  1181. X        fprintf(stderr, "file error\n");
  1182. X        else {
  1183. X        count=a;
  1184. X        printf("file read in: %d entries\n\n", count);
  1185. X        /*gets(tmp, STR_LEN);*/
  1186. X        }
  1187. X        break;
  1188. X
  1189. X    case WR1COM:
  1190. X    case WR2COM:
  1191. X        printf("file to save to:");
  1192. X        gets(fname);
  1193. X        if (save_tape(t, fname, count)==-1)  /* return -1 on error */
  1194. X        printf("Error: file not saved\n");
  1195. X        break;
  1196. X
  1197. X    case ADDCOM:
  1198. X        printf("enter 0 to quit...\n\n");
  1199. X        for(;;)
  1200. X        {
  1201. X        if (count>=MAX_NUM_TAPES)
  1202. X        {
  1203. X            printf("Can't have more than %d tapes\n", MAX_NUM_TAPES-1);
  1204. X            break;
  1205. X        }
  1206. X        printf("tape number=");
  1207. X        gets(tmp);
  1208. X        if (tmp[0] == '\0' && count > 0)
  1209. X        {
  1210. X            a=t[count-1]->num+1;
  1211. X            printf("%d\n", a);
  1212. X        }
  1213. X        else if ((a=atoi(tmp))==0)
  1214. X            break;
  1215. X        t[count]=(struct tape *) malloc(sizeof(struct tape));
  1216. X        t[count]->num=a;
  1217. X        printf("side %c:", SIDE1CHAR);
  1218. X        gets(t[count]->s1);
  1219. X        printf("side %c:", SIDE2CHAR);
  1220. X        gets(t[count]->s2);
  1221. X        ++count;    /*update current number of tapes*/
  1222. X        putchar('\n');
  1223. X        }    /*end of 'a'*/
  1224. X        break;
  1225. X
  1226. X    case EDITCOM:
  1227. X        printf("Enter tape #:");
  1228. X        gets(tmp);
  1229. X        if ((a=atoi(tmp))>0)
  1230. X        {
  1231. X        for(b=0; b<count && t[b]->num!=a; b++)
  1232. X            ;
  1233. X        if (b==count)
  1234. X        {
  1235. X            printf("tape not found\n");
  1236. X            break;
  1237. X        }
  1238. X        printf("%d:\n%c: %s\n%c: %s\n\n", t[b]->num, SIDE1CHAR,
  1239. X            t[b]->s1, SIDE2CHAR, t[b]->s2);
  1240. X
  1241. X#ifndef SIDEAB
  1242. X        printf("Edit: (1) Side 1, (2) Side 2, or (3) number:");
  1243. X
  1244. X        switch (a=atoi(gets(tmp))) {
  1245. X
  1246. X        case 3:
  1247. X            printf("\nNew Num:");
  1248. X            if ((a=atoi(gets(tmp)))>0)
  1249. X            t[b]->num=a;
  1250. X
  1251. X            break;
  1252. X
  1253. X        case 2:
  1254. X        case 1:
  1255. X            printf("\nNew Title for side %d:\n", a);
  1256. X            gets(Sx(t[b], a));
  1257. X            break;
  1258. X        } /*end of switch*/
  1259. X            printf("%d:\n1: %s\n2: %s\n\n", t[b]->num,
  1260. X                decode(tmp1, t[b]->s1), decode(tmp2, t[b]->s2));
  1261. X#else
  1262. X        printf("Edit: (A) Side A, (B) Side B, or (N) number:");
  1263. X
  1264. X        switch (a= *gets(tmp)) {
  1265. X
  1266. X        case 'N':
  1267. X        case '3':
  1268. X        case 'n':
  1269. X            printf("\nNew Num:");
  1270. X            if ((a=atoi(gets(tmp)))>0)
  1271. X            t[b]->num=a;
  1272. X
  1273. X            break;
  1274. X
  1275. X        case 'a':
  1276. X        case 'A':
  1277. X        case 'b':
  1278. X        case 'B':
  1279. X            a=(a=='a' || a=='A') ? 1 : 2 ;
  1280. X            printf("\nNew Title for side %c:\n", SIDECHAR(a));
  1281. X            gets(Sx(t[b], a));
  1282. X            break;
  1283. X        } /*end of switch*/
  1284. X            printf("%d:\nA: %s\nB: %s\n\n", t[b]->num,
  1285. X                decode(tmp1, t[b]->s1), decode(tmp2, t[b]->s2));
  1286. X#endif
  1287. X
  1288. X        } /*end of if (a>0)*/
  1289. X        break;
  1290. X
  1291. X    case LIST2COM:
  1292. X        c=FALSE;
  1293. X        for(a=0; a<count; a+=SCRHT)
  1294. X        {
  1295. X          for(b=a; b<a+SCRHT && b<count; b++)
  1296. X        printf("%d\t%s\n\t%s\n", t[b]->num, t[b]->s1,
  1297. X                    t[b]->s2);
  1298. X              if (!c && b<count)
  1299. X          {
  1300. X#ifndef MS_DOS
  1301. X          cbreak();
  1302. X#endif
  1303. X          printf("More (Quit, Continuous)?");
  1304. X          *tmp=getchar();
  1305. X#ifndef MS_DOS
  1306. X          nocbreak();
  1307. X#endif
  1308. X          putchar('\n');
  1309. X          if (*tmp=='q' || *tmp=='Q')
  1310. X              break;
  1311. X          if (*tmp=='c' || *tmp=='C')
  1312. X              c=TRUE;
  1313. X              }
  1314. X        }
  1315. X            break;
  1316. X
  1317. X    case LISTCOM:
  1318. X        c=FALSE;
  1319. X        for(a=0; a<count; a+=SCRHT)
  1320. X        {
  1321. X          for(b=a; b<a+SCRHT && b<count; b++)
  1322. X        printf("%d\t%s\n\t%s\n", t[b]->num, decode(tmp1, t[b]->s1),
  1323. X                    decode(tmp2,t[b]->s2));
  1324. X              if (!c && b<count)
  1325. X          {
  1326. X#ifndef MS_DOS
  1327. X          cbreak();
  1328. X#endif
  1329. X          printf("More (Quit, Continuous)?");
  1330. X          *tmp=getch();
  1331. X#ifndef MS_DOS
  1332. X          nocbreak();
  1333. X#endif
  1334. X          putchar('\n');
  1335. X          if (*tmp=='q' || *tmp=='Q')
  1336. X              break;
  1337. X          if (*tmp=='c' || *tmp=='C')
  1338. X              c=TRUE;
  1339. X              }
  1340. X        }
  1341. X            break;
  1342. X
  1343. X        case PRINTCOM:
  1344. X#ifdef MS_DOS
  1345. X        printf("Enter output device:\n(i.e. enter LPT1 to go to printer)");
  1346. X#else
  1347. X        printf("Enter output file:\n");
  1348. X#endif
  1349. X        printf("\n>");
  1350. X        gets(tmp);
  1351. X        if ((fp=fopen(tmp, "w")) == NULL)
  1352. X        {
  1353. X        fprintf(stderr, "Cannot open file\n");
  1354. X        break;
  1355. X            }
  1356. X
  1357. X            printf("\nPrint Format:\n");
  1358. X        printf("\t1: Standard output (just like '%c')\n", LISTCOM);
  1359. X        printf("\t2: Alphabetized index (num;side:Artist)\n");
  1360. X        printf("Choice:");
  1361. X        gets(tmp);
  1362. X
  1363. X            switch (atoi(tmp)) {
  1364. X
  1365. X            case 1:
  1366. X            for(a=0; a<count; a++)
  1367. X#ifndef SIDEAB
  1368. X            fprintf(fp,
  1369. X              /*don't print side2 if there ain't any*/
  1370. X                allblank(t[a]->s2) ? "Tape %4d side 1:%s\n"
  1371. X                  : "Tape %4d side 1:%s\n          side 2:%s\n",
  1372. X                    t[a]->num,
  1373. X                    decode(tmp1, t[a]->s1),
  1374. X                        decode(tmp2,t[a]->s2));
  1375. X#else
  1376. X            fprintf(fp,
  1377. X              /*don't print side2 if there ain't any*/
  1378. X                allblank(t[a]->s2) ? "Tape %4d side A:%s\n"
  1379. X                  : "Tape %4d side A:%s\n          side B:%s\n",
  1380. X                    t[a]->num,
  1381. X                    decode(tmp1, t[a]->s1),
  1382. X                        decode(tmp2,t[a]->s2));
  1383. X#endif
  1384. X                break;
  1385. X
  1386. X            case 2:
  1387. X        alpha_out(fp, t, count);
  1388. X        break;
  1389. X
  1390. X        } /*end of switch*/
  1391. X
  1392. X            fclose(fp);
  1393. X            break;
  1394. X
  1395. X    case CLEARCOM:
  1396. X        printf("Are you Sure(y/n)?");
  1397. X        gets(tmp);
  1398. X        if (*tmp=='y' || *tmp=='Y')
  1399. X            count=0;
  1400. X        break;
  1401. X
  1402. X        case RECOVCOM:    /*undocumented way of un-'C'ing...just enter a count*/
  1403. X        printf("Debug option - set new count\nEnter new number of tapes:");
  1404. X        if ((a=atoi(gets(tmp))) != 0)
  1405. X                count=a;
  1406. X        break;
  1407. X
  1408. X        case DELCOM:    /* Delete a tape */
  1409. X        printf("Delete tape\nEnter tape #:");
  1410. X        gets(tmp);
  1411. X        if ((a=atoi(tmp))>0)
  1412. X        {
  1413. X        for(b=0; b<count && t[b]->num!=a; b++)
  1414. X            ;
  1415. X        if (b==count)
  1416. X        {
  1417. X            printf("tape not found\n");
  1418. X            break;
  1419. X        }
  1420. X        printf("Tape: %d\nSide %c: %s\nSide %c: %s\nDelete (y/n)?",
  1421. X            t[b]->num, SIDE1CHAR, t[b]->s1, SIDE2CHAR, t[b]->s2);
  1422. X        gets(tmp);
  1423. X        if (tmp[0]=='y' || tmp[0]=='Y')
  1424. X        {
  1425. X            for(a=b; a<count-1; a++)
  1426. X                        t[a]=t[a+1];
  1427. X            t[a]=NULL;
  1428. X            count--;
  1429. X            printf("Tape deleted.\n");
  1430. X        }
  1431. X        else
  1432. X            printf("Tape not deleted.\n");
  1433. X            }
  1434. X        break;
  1435. X
  1436. X        case ORDCOM:    /*order tapes*/
  1437. X        printf("\nOrder with respect to:\n");
  1438. X        printf("\t1. Number\n\t2. Alphabetized to side %c\nChoice:",
  1439. X           SIDE1CHAR);
  1440. X        gets(tmp);
  1441. X        if ((a=atoi(tmp))==1 || a==2)
  1442. X        {
  1443. X                a=(a==1);    /*a is true if to be sorted numerically*/
  1444. X        printf("Sorting....");
  1445. X        fflush(stdout);
  1446. X
  1447. X                do {
  1448. X            b=0;    /*time for an inefficient bubble sort :-)*/
  1449. X            for(c=0; c<count-1; c++)
  1450. X                if (a ? t[c]->num > t[c+1]->num
  1451. X                  : strcmp(t[c]->s1, t[c+1]->s1) > 0)
  1452. X                        {
  1453. X                struct tape *tmp;
  1454. X                tmp=t[c];
  1455. X                t[c]=t[c+1];
  1456. X                t[c+1]=tmp;
  1457. X                b=1;
  1458. X                }
  1459. X        } while (b);
  1460. X
  1461. X                printf("Done.\n");
  1462. X        }
  1463. X        break;
  1464. X
  1465. X        case ALPHACOM:
  1466. X        printf("correct Alpha mismatch\n");
  1467. X        printf("1. Search for \"The\"\n");
  1468. X        printf("2. Name Search.\n");
  1469. X        printf("3. Specific Tape and Side.\n\n");
  1470. X        printf("Enter choice:");
  1471. X        gets(tmp);
  1472. X
  1473. X        switch (a=atoi(tmp)) {
  1474. X          case 1:
  1475. X        strcpy(tmp, "The");
  1476. X          case 2:
  1477. X        if (a!=1)
  1478. X        {
  1479. X            printf("Enter name to search for:");
  1480. X            gets(tmp);
  1481. X        }
  1482. X        c=strlen(tmp);
  1483. X
  1484. X        for(a=0; a<count; a++)
  1485. X          for(b=1; b<=2; b++)
  1486. X            if (strnicmp(Sx(t[a], b), tmp, c) == 0)
  1487. X            if (correct(Sx(t[a], b)) == -1)
  1488. X                goto qhit;
  1489. X    qhit:
  1490. X                break;
  1491. X
  1492. X              case 3:
  1493. X            printf("Enter tape number:");
  1494. X            gets(tmp);
  1495. X                if ((a=atoi(tmp))<1)
  1496. X                break;
  1497. X
  1498. X                for(c=0; t[c]->num!=a && c<count; c++)
  1499. X            ;
  1500. X            if (c==count)
  1501. X            {
  1502. X            printf("Tape not found\n");
  1503. X            break;
  1504. X            }
  1505. X
  1506. X                printf("Enter side:");
  1507. X            gets(tmp);
  1508. X        if (islower(*tmp))
  1509. X            *tmp=toupper(*tmp);
  1510. X
  1511. X            if (*tmp!=SIDE1CHAR && *tmp!=SIDE2CHAR)
  1512. X            break;
  1513. X
  1514. X                correct(*tmp!=SIDE1CHAR ? t[c]->s2 : t[c]->s1);
  1515. X            break;
  1516. X            } /* end of switch(a=atoi(tmp)) */
  1517. X        break;
  1518. X
  1519. X    case QUITCOM:
  1520. X        printf("\nBye !\n");
  1521. X
  1522. X#ifndef MS_DOS
  1523. X            nocbreak();
  1524. X        endwin();
  1525. X#endif
  1526. X        exit(0);
  1527. X
  1528. X    default:
  1529. X        fprintf(stderr, "error???\nUse 'H' for help\n");
  1530. X
  1531. X    }    /*end of command switch*/
  1532. X    }    /*end of for(;;)*/
  1533. X
  1534. X}    /*end of main()*/
  1535. X
  1536. SHAR_EOF
  1537. chmod 0640 main.c || echo "restore of main.c fails"
  1538. set `wc -c main.c`;Sum=$1
  1539. if test "$Sum" != "10479"
  1540. then echo original size 10479, current size $Sum;fi
  1541. fi
  1542. if test -f tape.prj; then echo "File tape.prj exists"; else
  1543. echo "x - extracting tape.prj (Text)"
  1544. sed 's/^X//' << 'SHAR_EOF' > tape.prj &&
  1545. Xmain (header.h)
  1546. Xio (header.h)
  1547. Xalpha (header.h)
  1548. SHAR_EOF
  1549. chmod 0640 tape.prj || echo "restore of tape.prj fails"
  1550. set `wc -c tape.prj`;Sum=$1
  1551. if test "$Sum" != "47"
  1552. then echo original size 47, current size $Sum;fi
  1553. fi
  1554. exit 0
  1555.  
  1556.