home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / unix / volume6 / elm / part12 < prev    next >
Text File  |  1986-11-30  |  58KB  |  2,557 lines

  1. Subject: v06i037:  Elm mail system (elm), Part12/14
  2. Newsgroups: mod.sources
  3. Approved: rs@mirror.UUCP
  4.  
  5. Submitted by: Dave Taylor <pyramid!hplabs!hpldat!taylor>
  6. Mod.sources: Volume 6, Issue 37
  7. Archive-name: elm/Part12
  8.  
  9. # Continuation of Shell Archive, created by hpldat!taylor
  10.  
  11. # This is part 12
  12.  
  13. # To unpack the enclosed files, please use this file as input to the
  14. # Bourne (sh) shell.  This can be most easily done by the command;
  15. #     sh < thisfilename
  16.  
  17.  
  18. if [ ! -d src ]
  19. then
  20.   echo creating directory src
  21.   mkdir src
  22. fi
  23.  
  24. # ---------- file src/screen3270.q ----------
  25.  
  26. filename="src/screen3270.q"
  27.  
  28. if [ -f $filename ]
  29. then
  30.   echo File \"$filename\" already exists\!  Skipping...
  31.   filename=/dev/null        # throw it away
  32. else
  33.   echo extracting file src/screen3270.q...
  34. fi
  35.  
  36. sed 's/^X//' << 'END-OF-FILE' > $filename
  37. XFrom hpccc!mcgregor@hplabs.ARPA Thu Jun  5 11:41:49 1986
  38. XReceived: from hplabs.ARPA by hpldat ; Thu, 5 Jun 86 11:41:32 pdt
  39. XMessage-Id: <8606051841.AA16872@hpldat>
  40. XReceived: by hplabs.ARPA ; Thu, 5 Jun 86 11:38:07 pdt
  41. XTo: hplabs!taylor@hplabs.ARPA
  42. XDate: Thu, 5 Jun 86 11:36:39 PDT
  43. XFrom: hpccc!mcgregor@hplabs.ARPA (Scott McGregor)
  44. XSubject: revised screen3270.q
  45. XTelephone: (415) 857-5875
  46. XPostal-Address: Hewlett-Packard, PO Box 10301, Mail stop 20CH, Palo Alto CA 943X03-0890
  47. XX-Mailer: ELM [version 1.0]
  48. X
  49. X
  50. X/*
  51. X * screen3270.q
  52. X *
  53. X *   Created for ELM, 5/86 to work (hopefully) on UTS systems with 3270
  54. X *   type terminals, by Scott L. McGregor, HP Corporate Computing Center.
  55. X *
  56. X */
  57. X
  58. X#include "headers.h"
  59. X#  include <sys/utsname.h>
  60. X#  include <sys/tubio.h>
  61. X
  62. X#  include <errno.h>
  63. X
  64. X
  65. X#  define  TTYIN        0        /* standard input */
  66. X#include <stdio.h>
  67. X#define MAXKEYS 101
  68. X#define OFF 0
  69. X#define UNKNOWN 0
  70. X#define ON 1
  71. X#define FALSE 0
  72. X#define TRUE 1
  73. X
  74. Xchar *error_name();
  75. X
  76. Xextern int _line, _col;
  77. X
  78. Xpfinitialize()
  79. X{
  80. X    char cp[80];
  81. X    
  82. X    dprint0(9,"pfinitialize()\n");
  83. X    pfinit();
  84. X    /*
  85. X     * load the system defined pfkeys
  86. X     */
  87. X    pfload("/usr/local/etc/.elmpfrc");
  88. X    /*
  89. X     * load the user's keys if any
  90. X     */
  91. X    strcat(cp,home);
  92. X    strcat(cp,"/.elmpfrc");
  93. X    pfload(cp);
  94. X    pfprint();
  95. X}
  96. X
  97. X/*
  98. X * note, inputs are limited to 80 characters! Any larger amount
  99. X * will be truncated without notice!
  100. X */
  101. X
  102. X
  103. X/*
  104. X * pfinit() initializes _pftable
  105. X */
  106. Xpfinit()
  107. X{
  108. X    int i,j;
  109. X    
  110. X    dprint0(9,"pfinit()\n");
  111. X    for (i=0;i<MAXKEYS;i++) {
  112. X        for (j=0;j<80;j++) {
  113. X            _pftable[i][j]='\0';
  114. X        }
  115. X    }
  116. X    return(0);
  117. X}
  118. X
  119. X
  120. X/*
  121. X * pfset(key) sets _pftable entries.
  122. X */
  123. Xpfset(key,return_string)
  124. Xint key;
  125. Xchar *return_string;
  126. X{
  127. X    int i;
  128. X
  129. X    dprint2(9,"pfset(%d,%s)\n",key,return_string);
  130. X    for (i=0;i<=80;i++) {
  131. X        if (i <= strlen(return_string))
  132. X            _pftable[key][i] = return_string[i];
  133. X        else _pftable[key][i] = '\0';
  134. X    }
  135. X    dprint2(9,"pfset: %d %s\n",key,_pftable[key]);
  136. X       
  137. X    return(0);
  138. X}
  139. X
  140. X/*
  141. X *  pfload(name) reads file "name" and parses the
  142. X *  key definitions in it into a table used by the
  143. X *  pfreturn.
  144. X */
  145. Xpfload(name)
  146. Xchar *name;
  147. X{
  148. X    FILE *pfdefs;
  149. X    int i,j,k;
  150. X    int key = 0;
  151. X    char defn[80];
  152. X    char newdefn[80];
  153. X
  154. X    dprint1(9,"pfload(%s)\n",name);
  155. X    if ((pfdefs = fopen(name,"r")) == NULL){
  156. X        dprint2(2,"%s pfrc open failed, %s \n",name,
  157. X            error_name(errno));
  158. X        return(0);
  159. X     }
  160. X
  161. X     /*
  162. X      * This program reads .elmpfrc files which it currently
  163. X      * expects to be in the form:
  164. X      * 
  165. X      * <pfkeynumber> <whitespace> <pfkeyvalue> [<whitespace> <comment>]
  166. X      * 
  167. X      * Pfkeynumber is an integer 1-24.  Whitespace can be one
  168. X      * or more blanks or tabs.  Pfkeyvalue is any string NOT
  169. X      * containing whitespace (however, \b for blank, \t for tab
  170. X      * and \n for newline can be used instead to indicate that
  171. X      * the indicated whitespace character is part of a command.
  172. X      * Note that the EnTER key will NOT be treated as a newline
  173. X      * command, so defining a newline key is a good idea!
  174. X      * Anything else appearing on the line after the pfkey is ignored
  175. X      * and so can be used as a comment.
  176. X      *
  177. X      * This may not be the best form for a file used by
  178. X      * humans to set parms, and if someone comes up with a
  179. X      * better one and a parser to read it, then this can be
  180. X      * replaced.
  181. X      *
  182. X      */
  183. X     
  184. X    dprint1(1,"%s pfrc opened\n",name);
  185. X    k = 0;
  186. X    while ( fscanf(pfdefs,"%d%s",&key,defn) != EOF ) {
  187. X        dprint2(9,"pfkey definition 1: %d %s\n",key,defn);
  188. X        if ((key < 0) || (key > MAXKEYS)) {
  189. X            dprint2(9,"pfkey defn failed: key=%d MAXKEYS=%d\n",key,MAXKEYS);
  190. X            k++;
  191. X        } else {
  192. X            dprint2(9,"pfkey definition 2: %d %s\n",key,defn);
  193. X            for (i=0,j=0;i<strlen(defn);i++) {
  194. X                if (defn[i]=='\\') {
  195. X                    if (defn[i+1]=='n') {
  196. X                        newdefn[j++]='\n'; i++;
  197. X                    }
  198. X                    if (defn[i+1]=='t') {
  199. X                        newdefn[j++]='\t'; i++;
  200. X                    }
  201. X                    if (defn[i+1]=='0') {
  202. X                        newdefn[j++]='\0'; i++;
  203. X                    }
  204. X                    if (defn[i+1]=='1') {
  205. X                        newdefn[j++]='\001'; i++;
  206. X                    }
  207. X                    if (defn[i+1]=='b') {
  208. X                        newdefn[j++]=' '; i++;
  209. X                    }
  210. X                }
  211. X                 else {
  212. X                    newdefn[j++]=defn[i];
  213. X                }
  214. X            }
  215. X            dprint2(9,"pfkey new definition: %d %s\n",key,newdefn);
  216. X            pfset(key,newdefn);
  217. X        }
  218. X    }
  219. X    dprint1(9,"pfkey definition table:  %s\n",_pftable);
  220. X    return(k);
  221. X}
  222. X
  223. X
  224. X/*
  225. X * pfreturn(key) returns the stored string for that pfkey.
  226. X */
  227. Xpfreturn(key,string)
  228. Xint key;
  229. Xchar string[];
  230. X{
  231. X    int i;
  232. X    
  233. X    dprint2(9,"pfreturn(%d,%s)\n",key,string);
  234. X    for (i=0;i<80;i++) {
  235. X        string[i] = _pftable[key][i];
  236. X    }
  237. X    dprint1(9,"pfreturn string=%s\n",string);
  238. X    return;
  239. X}
  240. X
  241. X
  242. X/*
  243. X * pfprint() prints all pfkey definitions
  244. X */
  245. Xpfprint()
  246. X
  247. X{
  248. X    int i;
  249. X    char string[80];
  250. X
  251. X    for (i=0;i<MAXKEYS;i++) {
  252. X        if (strlen(_pftable[i]) != 0)
  253. X        dprint2(9,"%d pf table entry=%s\n",i+1,_pftable[i]);
  254. X    }
  255. X}
  256. X
  257. X/*
  258. X * rowcol2offset(row,col) takes the row and column numbers and
  259. X * returns the offset into the array.
  260. X * row and column are assumed to vary from 0 to LINES-1, and COLUMNS-1
  261. X * respectively.
  262. X */
  263. Xrowcol2offset(row,col)
  264. Xint row, col;
  265. X{
  266. X    dprint2(9,"rowcol2offset(%d,%d)\n",row,col);
  267. X    
  268. X    if ((row <= LINES) && (row >= 0)) {
  269. X        if ((col <= COLUMNS) && (col >=0)) {
  270. X            return(row*COLUMNS+col);
  271. X        }
  272. X        else return(0);
  273. X    }
  274. X    else return(0);
  275. X}
  276. X
  277. X/*
  278. X * offset2row(offset) takes the offset returnes the row.
  279. X * row is assumed to vary from 0 to LINES-1.
  280. X */
  281. Xoffset2row(offset)
  282. Xint offset;
  283. X{
  284. X    int i;
  285. X    
  286. X    dprint1(9,"offset2row(%d)\n",offset);
  287. X    i =  (int) (offset / COLUMNS);
  288. X    dprint1(9,"offset2row returns= %d)\n",i);
  289. X    return(i);
  290. X}
  291. X
  292. X/*
  293. X * offset2col(offset) takes the offset returnes the col.
  294. X * col is assumed to vary from 0 to COLUMNS-1.
  295. X */
  296. Xoffset2col(offset)
  297. Xint offset;
  298. X{
  299. X    int i;
  300. X    
  301. X    dprint1(9,"offset2col(%d)\n",offset);
  302. X    i =  (int) (offset % COLUMNS);
  303. X    dprint1(9,"offset2col returns= %d)\n",i);
  304. X    return(i);
  305. X}
  306. X
  307. X/*
  308. X * Row(row) takes the row in 0 <= row < LINES and returns
  309. X * row in 0 < row <= LINES.
  310. X */
  311. XRow(row)
  312. Xint row;
  313. X{
  314. X    dprint1(9,"Row(%d)\n",row);
  315. X    return(row+1);
  316. X}
  317. X
  318. X/*
  319. X * Col(Col) takes the col in 0 <= col < COLUMNS and returns
  320. X * col in 0 < col <= COLUMNS.
  321. X */
  322. XCol(col)
  323. Xint col;
  324. X{
  325. X    dprint1(9,"Col(%d)\n",col);
  326. X    return(col+1);
  327. X}
  328. X
  329. X
  330. Xgethostname(hostname,size) /* get name of current host */
  331. Xint size;
  332. Xchar *hostname;
  333. X{
  334. X    /** Return the name of the current host machine.  UTS only **/
  335. X
  336. X    /** This routine compliments of Scott McGregor at the HP
  337. X        Corporate Computing Center **/
  338. X     
  339. X    int uname();
  340. X    struct utsname name;
  341. X
  342. X        dprint2(9,"gethostname(%s,%d)\n",hostname,size);
  343. X    (void) uname(&name);
  344. X    (void) strncpy(hostname,name.nodename,size-1);
  345. X    if (strlen(name.nodename) > SLEN)
  346. X      hostname[size] = '\0';
  347. X}
  348. X
  349. Xint
  350. Xisa3270()
  351. X{
  352. X    /** Returns TRUE and sets LINES and COLUMNS to the correct values
  353. X        for an Amdahl (IBM) tube screen, or returns FALSE if on a normal
  354. X        terminal (of course, next to a 3270, ANYTHING is normal!!) **/
  355. X
  356. X    struct tubiocb tubecb;
  357. X    
  358. X    dprint0(9,"isa3270()\n");
  359. X    if (ioctl(TTYIN, TUBGETMOD, &tubecb) == -1){
  360. X      return(FALSE);    /* not a tube! */
  361. X    }
  362. X    LINES   = tubecb.line_cnt - 2;
  363. X    COLUMNS = tubecb.col_cnt;
  364. X    if (!check_only && !mail_only) {
  365. X        isatube = TRUE;
  366. X        return(TRUE);
  367. X    }
  368. X     else {
  369. X         isatube = FALSE;
  370. X         return(FALSE);
  371. X    }
  372. X}
  373. X
  374. X/*
  375. X * ReadCh3270() reads a character from the 3270.
  376. X */
  377. Xint ReadCh3270()
  378. X{
  379. X        /** read a character from the display! **/
  380. X
  381. X    register int x;
  382. X    char tempstr[80];
  383. X        char ch;
  384. X    
  385. X    dprint0(9,"ReadCh3270()\n");
  386. X    if ((_input_buf_ptr > COLUMNS) ||
  387. X        (_input_buffer[_input_buf_ptr] == '\0')) {
  388. X        WriteScreen3270();
  389. X        for (x=0; x < COLUMNS; x++) _input_buffer[x] = '\0';
  390. X        panel (noerase, read) {
  391. X            #@ LINES+1,1# #INC,_input_buffer,COLUMNS#
  392. X        }
  393. X        dprint1(9,"ReadCh3270 _input_buffer=%s\n",_input_buffer);
  394. X        x=strlen(_input_buffer);
  395. X        pfreturn(qskp,tempstr);
  396. X        if (!strcmp(tempstr,"\001")) {
  397. X            if (strlen(_input_buffer) == 1) {
  398. X                tempstr[0]='\0';
  399. X            }
  400. X             else {
  401. X                tempstr[0]='\n';
  402. X                tempstr[1]='\0';
  403. X            }
  404. X        }
  405. X        dprint1(9,"ReadCh3270 pfkey=%s\n",tempstr);
  406. X        strcat(_input_buffer,tempstr);
  407. X        dprint1(9,"ReadCh3270 _input_buffer+pfkey=%s\n",_input_buffer);
  408. X        ch = _input_buffer[0];
  409. X        dprint1(9,"ReadCh3270 returns(%c)\n",ch);
  410. X        _input_buf_ptr = 1;
  411. X        return(ch);
  412. X    }
  413. X     else {
  414. X         ch = _input_buffer[_input_buf_ptr];
  415. X         dprint1(9,"ReadCh3270 returns(%c)\n",ch);
  416. X         _input_buf_ptr = _input_buf_ptr + 1;
  417. X         return(ch);
  418. X    }
  419. X}
  420. X
  421. X
  422. X/*
  423. X * WriteScreen3270() Loads a screen to the buffer.
  424. X *
  425. X */
  426. XWriteScreen3270()
  427. X{
  428. X    register int x;
  429. X    int currcol;
  430. X    int currrow;
  431. X    int i;
  432. X    int state = OFF;
  433. X    int prevrow = 1;
  434. X    int prevcol = 1;
  435. X    int prevptr = 0;
  436. X    int clear_state = ON;
  437. X    char tempstr[80];
  438. X    char copy_screen[66*132];
  439. X    
  440. X    dprint0(9,"WriteScreen3270()\n");
  441. X    prevrow = 1;
  442. X    prevcol = 1;
  443. X    prevptr = 0;
  444. X    state = OFF;
  445. X    for (x=0; x < LINES*COLUMNS; x++){
  446. X        if ((_internal_screen[x] == '\016')
  447. X        && (state == OFF)) {
  448. X            currrow = (x / COLUMNS ) + 1;
  449. X            currcol = (x % COLUMNS ) + 1 ;
  450. X            i = x - prevptr - 1;
  451. X            strncpy(copy_screen, (char *) (_internal_screen+(prevptr)),i);
  452. X            panel(erase=clear_state,write,noread) {
  453. X                #@ prevrow, prevcol # #ON,copy_screen,i #
  454. X            }
  455. X            clear_state = OFF;
  456. X            state = ON;
  457. X             /* prevrow = currrow; */
  458. X             /* prevcol = currcol; */
  459. X            prevrow = currrow + 1;
  460. X            prevcol = 0;
  461. X            prevptr = x+1;
  462. X        }
  463. X        else if ((_internal_screen[x] == '\017')
  464. X        && (state == ON)) {
  465. X            currrow = (x / COLUMNS ) + 1;
  466. X            currcol = (x % COLUMNS ) + 1;
  467. X            i = x - prevptr - 1;
  468. X            strncpy(copy_screen, (char *) (_internal_screen+(prevptr)),i);
  469. X            panel(erase = clear_state,write,noread) {
  470. X                #@ prevrow,prevcol # #OH,copy_screen,i #
  471. X            }
  472. X            clear_state = OFF;
  473. X            state = OFF;
  474. X             /* prevrow = currrow; */
  475. X             /* prevcol = currcol; */
  476. X            prevrow = currrow + 1;
  477. X            prevcol = 0;
  478. X        }
  479. X           else if (_internal_screen[x] < ' ') {
  480. X            _internal_screen[x] = ' ';
  481. X            prevptr = x + 1;
  482. X           }
  483. X    }
  484. X    /* write remainder of buffer */
  485. X    if (state == OFF) {
  486. X        currrow = (LINES) + 1 ;
  487. X        currcol = (COLUMNS ) + 1;
  488. X        i = x - prevptr  ;
  489. X        strncpy(copy_screen, (char *) (_internal_screen+(prevptr)),i);
  490. X        panel(erase=clear_state,write,noread) {
  491. X            #@ prevrow,prevcol # #ON,copy_screen,i #
  492. X        }
  493. X    }
  494. X    else {
  495. X        currrow = (LINES ) + 1 ;
  496. X        currcol = (COLUMNS ) + 1 ;
  497. X        i = x - prevptr ;
  498. X        strncpy(copy_screen, (char *) (_internal_screen+(prevptr)),i);
  499. X        panel(erase=clear_state,write,noread) {
  500. X            #@ prevrow,prevcol # #OH,copy_screen,i #
  501. X        }
  502. X    }
  503. X}
  504. X
  505. X
  506. X/*
  507. X * Clear3270
  508. X */
  509. XClear3270()
  510. X{
  511. X    int  i,j;
  512. X    
  513. X    dprint0(9,"Clear3270()\n");
  514. X    j = rowcol2offset(LINES,COLUMNS);
  515. X    for (i = 0; i < j; i++) {
  516. X        _internal_screen[i] = ' ';
  517. X    }
  518. X    return(0);
  519. X}
  520. X
  521. X/*
  522. X *  WriteChar3270(row,col) writes a character at the row and column.
  523. X */
  524. XWriteChar3270(row,col,ch)
  525. Xint row, col;
  526. Xchar ch;
  527. X{
  528. X    dprint3(9,"WriteChar3270(%d,%d,%c)\n",row,col,ch);
  529. X    _internal_screen[rowcol2offset(row,col)] = ch;
  530. X}
  531. X
  532. X/*
  533. X *  WriteLine3270(row,col) writes a line at the row and column.
  534. X */
  535. XWriteLine3270(row,col,line)
  536. Xint row, col;
  537. Xchar *line;
  538. X{
  539. X    int i, j, k;
  540. X    dprint3(9,"WriteLine3270(%d,%d,%s)\n",row,col,line);
  541. X        _line = row;
  542. X    _col = col;
  543. X    k = strlen(line);
  544. X    i=rowcol2offset(row,col);
  545. X    for (j=0; j<k; i++, j++) {
  546. X        if ((line[j] >= ' ')   ||
  547. X           (line[j] == '\016') ||
  548. X           (line[j] == '\017'))
  549. X        _internal_screen[i] = line[j];
  550. X        else _internal_screen[i] = ' ';
  551. X    }
  552. X   /*   _line = offset2row(i-1);  calling program updates location */
  553. X   /*   _col  = offset2col(i-1); */
  554. X    
  555. X}
  556. X
  557. X
  558. X/*
  559. X * ClearEOLN3270() clears the remainder of the current line on a 3270.
  560. X */
  561. XClearEOLN3270()
  562. X{
  563. X    int i,j ;
  564. X    
  565. X    dprint0(9,"ClearEOLN3270()\n");
  566. X    j = rowcol2offset(_line,COLUMNS);
  567. X    for (i=rowcol2offset(_line,_col); i < j; i++) {
  568. X        _internal_screen[i] = ' ';
  569. X    }
  570. X}
  571. X
  572. X/*
  573. X * ClearEOS3270() clears the remainder of the current screen on a 3270.
  574. X */
  575. XClearEOS3270()
  576. X{
  577. X    int i,j;
  578. X    
  579. X    dprint0(9,"ClearEOS3270()\n");
  580. X    j = rowcol2offset(LINES,COLUMNS);
  581. X        for (i = rowcol2offset(_line,_col); i < j; i++) {
  582. X        _internal_screen[i] = ' ';
  583. X    }
  584. X}
  585. X
  586. END-OF-FILE
  587.  
  588. if [ "$filename" != "/dev/null" ]
  589. then
  590.   size=`wc -c < $filename`
  591.  
  592.   if [ $size != 11592 ]
  593.   then
  594.     echo $filename changed - should be 11592 bytes, not $size bytes
  595.   fi
  596.  
  597.   chmod 666 $filename
  598. fi
  599.  
  600. # ---------- file src/UTS.DIFFS ----------
  601.  
  602. filename="src/UTS.DIFFS"
  603.  
  604. if [ -f $filename ]
  605. then
  606.   echo File \"$filename\" already exists\!  Skipping...
  607.   filename=/dev/null        # throw it away
  608. else
  609.   echo extracting file src/UTS.DIFFS...
  610. fi
  611.  
  612. sed 's/^X//' << 'END-OF-FILE' > $filename
  613. XFrom hpccc!mcgregor@hplabs.ARPA Wed Jun  4 17:16:32 1986
  614. XReceived: from hplabs.ARPA by hpldat ; Wed, 4 Jun 86 17:16:16 pdt
  615. XMessage-Id: <8606050016.AA16171@hpldat>
  616. XReceived: by hplabs.ARPA ; Wed, 4 Jun 86 17:11:46 pdt
  617. XDate: Wed, 4 Jun 86 17:09:05 pdt
  618. XFrom: Scott McGregor <hpccc!mcgregor@hplabs.ARPA>
  619. XTo: taylor@hplabs
  620. X
  621. X
  622. X
  623. XJun  4 14:05 1986  /ccc/mcgregor/elm2/src only and /ccc/mcgregor/elm/src only PXage 1
  624. X
  625. X
  626. X./a.out                        ./curses.q
  627. X./addr_utils.o
  628. X./alias.o
  629. X./aliasdb.o
  630. X./aliaslib.o
  631. X./args.o
  632. X./bounceback.o
  633. X./calendar.o
  634. X./ckhpdesk.c
  635. X./ckhpdesk.o
  636. X./connect_to.o
  637. X./curses.c
  638. X./curses.o
  639. X./curses.q1
  640. X./date.o
  641. X./delete.o
  642. X./domains.o
  643. X./edit.o
  644. X./elm.o
  645. X./encode.o
  646. X./errno.o
  647. X./file.o
  648. X./file_utils.o
  649. X./fileio.o
  650. X./hdrconfg.o
  651. X./help.o
  652. X./initialize.o
  653. X./input_utils.o
  654. X./leavembox.o
  655. X./mailmsg1.o
  656. X./mailmsg2.o
  657. X./mailtime.o
  658. X./mkhdrs.o
  659. X./ned.tmpa28250
  660. X./newmbox.o
  661. X./notesfile.o
  662. X./opt_utils.o
  663. X./options.o
  664. X./output_utils.o
  665. X./pattern.o
  666. X./quit.o
  667. X./read_rc.o
  668. X./remail.o
  669. X./reply.o
  670. X./return_addr.o
  671. X./savecopy.o
  672. X./screen.o
  673. X./screen3270.o
  674. X./screen3270.q
  675. X./showmsg.o
  676. X./signals.o
  677. X./softkeys.o
  678. X./sort.o
  679. X./strings.o
  680. X./syscall.o
  681. X./utils.o
  682. X
  683. X
  684. X
  685. X
  686. X
  687. X
  688. X
  689. XJun  4 14:05 1986  /ccc/mcgregor/elm2/src only and /ccc/mcgregor/elm/src only PXage 2
  690. X
  691. X
  692. X./validname.o
  693. X./
  694. X
  695. X
  696. X
  697. X
  698. X
  699. X
  700. X
  701. X
  702. X
  703. X
  704. X
  705. X
  706. X
  707. X
  708. X
  709. X
  710. X
  711. X
  712. X
  713. X
  714. X
  715. X
  716. X
  717. X
  718. X
  719. X
  720. X
  721. X
  722. X
  723. X
  724. X
  725. X
  726. X
  727. X
  728. X
  729. X
  730. X
  731. X
  732. X
  733. X
  734. X
  735. X
  736. X
  737. X
  738. X
  739. X
  740. X
  741. X
  742. X
  743. X
  744. X
  745. X
  746. X
  747. X
  748. X
  749. X
  750. X
  751. X
  752. X
  753. X
  754. X
  755. XJun  4 14:05 1986  Comparison of /ccc/mcgregor/elm2/src /ccc/mcgregor/elm/src PXage 1
  756. X
  757. X
  758. Xdirectory    .
  759. Xsame         ./.emacs_106
  760. Xsame         ./INDEX
  761. Xsame         ./Makefile
  762. Xsame         ./addr_utils.c
  763. Xdifferent    ./alias.c
  764. Xsame         ./aliasdb.c
  765. Xdifferent    ./aliaslib.c
  766. Xsame         ./args.c
  767. Xsame         ./bounceback.c
  768. Xsame         ./calendar.c
  769. Xsame         ./connect_to.c
  770. Xsame         ./curses.IBM
  771. Xsame         ./curses.msg3.3
  772. Xsame         ./curses.q_
  773. Xsame         ./date.c
  774. Xsame         ./delete.c
  775. Xsame         ./domains.c
  776. Xsame         ./edit.c
  777. Xdifferent    ./elm.c
  778. Xsame         ./encode.c
  779. Xsame         ./errno.c
  780. Xsame         ./file.c
  781. Xsame         ./file_utils.c
  782. Xsame         ./fileio.c
  783. Xsame         ./hdrconfg.c
  784. Xsame         ./help.c
  785. Xsame         ./initialize.c
  786. Xsame         ./initialize.uts
  787. Xsame         ./input_utils.c
  788. Xsame         ./leavembox.c
  789. Xsame         ./mailmsg1.c
  790. Xsame         ./mailmsg2.c
  791. Xsame         ./mailtime.c
  792. Xsame         ./mkhdrs.c
  793. Xsame         ./ned.erra27313
  794. Xsame         ./ned.erra27590
  795. Xsame         ./newmbox.c
  796. Xsame         ./notesfile.c
  797. Xsame         ./opt_utils.c
  798. Xsame         ./opt_utils.c_
  799. Xsame         ./options.c
  800. Xsame         ./output_utils.c
  801. Xsame         ./pattern.c
  802. Xsame         ./quit.c
  803. Xsame         ./read_rc.c
  804. Xsame         ./read_rcc
  805. Xsame         ./remail.c
  806. Xsame         ./reply.c
  807. Xsame         ./return_addr.c
  808. Xsame         ./savecopy.c
  809. Xdifferent    ./screen.c
  810. Xsame         ./showmsg.c
  811. Xsame         ./signals.c
  812. Xsame         ./softkeys.c
  813. Xsame         ./sort.c
  814. X
  815. X
  816. X
  817. X
  818. X
  819. X
  820. X
  821. XJun  4 14:05 1986  Comparison of /ccc/mcgregor/elm2/src /ccc/mcgregor/elm/src PXage 2
  822. X
  823. X
  824. Xsame         ./strings.c
  825. Xdifferent    ./syscall.c
  826. Xsame         ./utils.c
  827. Xsame         ./validname.c
  828. X
  829. X
  830. X
  831. X
  832. X
  833. X
  834. X
  835. X
  836. X
  837. X
  838. X
  839. X
  840. X
  841. X
  842. X
  843. X
  844. X
  845. X
  846. X
  847. X
  848. X
  849. X
  850. X
  851. X
  852. X
  853. X
  854. X
  855. X
  856. X
  857. X
  858. X
  859. X
  860. X
  861. X
  862. X
  863. X
  864. X
  865. X
  866. X
  867. X
  868. X
  869. X
  870. X
  871. X
  872. X
  873. X
  874. X
  875. X
  876. X
  877. X
  878. X
  879. X
  880. X
  881. X
  882. X
  883. X
  884. X
  885. X
  886. X
  887. XJun  4 14:05 1986  diff of ./alias.c in /ccc/mcgregor/elm2/src and /ccc/mcgregoXr/elm/src Page 1
  888. X
  889. X
  890. X14a15,16
  891. X> extern char ReadCh();
  892. X> extern int Raw();
  893. X
  894. X
  895. X
  896. X
  897. X
  898. X
  899. X
  900. X
  901. X
  902. X
  903. X
  904. X
  905. X
  906. X
  907. X
  908. X
  909. X
  910. X
  911. X
  912. X
  913. X
  914. X
  915. X
  916. X
  917. X
  918. X
  919. X
  920. X
  921. X
  922. X
  923. X
  924. X
  925. X
  926. X
  927. X
  928. X
  929. X
  930. X
  931. X
  932. X
  933. X
  934. X
  935. X
  936. X
  937. X
  938. X
  939. X
  940. X
  941. X
  942. X
  943. X
  944. X
  945. X
  946. X
  947. X
  948. X
  949. X
  950. X
  951. X
  952. X
  953. XJun  4 14:05 1986  diff of ./aliaslib.c in /ccc/mcgregor/elm2/src and /ccc/mcgrXegor/elm/src Page 1
  954. X
  955. X
  956. X9d8
  957. X< #include <pwd.h>
  958. X59,63c58,62
  959. X<      if (getpwnam(name)==NULL) {
  960. X<          dprint3(8,"get_alias_address(%s,%d,%d)\n",name,mailing,depth);
  961. X<          strcpy( buffer, ckhpdesk(name));
  962. X<          dprint1(8,"get_alias_address:  returns (%s)\n",buffer);
  963. X<          return( (char *) buffer);
  964. X---
  965. X>      for (i=0;i<strlen(name);i++) {
  966. X>         
  967. X>      }
  968. X>      if () {
  969. X>          return( (char *) ckhpdesk(name));
  970. X
  971. X
  972. X
  973. X
  974. X
  975. X
  976. X
  977. X
  978. X
  979. X
  980. X
  981. X
  982. X
  983. X
  984. X
  985. X
  986. X
  987. X
  988. X
  989. X
  990. X
  991. X
  992. X
  993. X
  994. X
  995. X
  996. X
  997. X
  998. X
  999. X
  1000. X
  1001. X
  1002. X
  1003. X
  1004. X
  1005. X
  1006. X
  1007. X
  1008. X
  1009. X
  1010. X
  1011. X
  1012. X
  1013. X
  1014. X
  1015. X
  1016. X
  1017. X
  1018. X
  1019. XJun  4 14:06 1986  diff of ./elm.c in /ccc/mcgregor/elm2/src and /ccc/mcgregor/Xelm/src Page 1
  1020. X
  1021. X
  1022. X26a27,30
  1023. X>          debug = 9;
  1024. X>     printf("Main program begins\n"); fflush(stdout);
  1025. X>     debugfile = fopen("/ccc/mcgregor/ELM:debug.info","w")
  1026. X>     dprint0(1, "Main program begins\n");
  1027. X
  1028. X
  1029. X
  1030. X
  1031. X
  1032. X
  1033. X
  1034. X
  1035. X
  1036. X
  1037. X
  1038. X
  1039. X
  1040. X
  1041. X
  1042. X
  1043. X
  1044. X
  1045. X
  1046. X
  1047. X
  1048. X
  1049. X
  1050. X
  1051. X
  1052. X
  1053. X
  1054. X
  1055. X
  1056. X
  1057. X
  1058. X
  1059. X
  1060. X
  1061. X
  1062. X
  1063. X
  1064. X
  1065. X
  1066. X
  1067. X
  1068. X
  1069. X
  1070. X
  1071. X
  1072. X
  1073. X
  1074. X
  1075. X
  1076. X
  1077. X
  1078. X
  1079. X
  1080. X
  1081. X
  1082. X
  1083. X
  1084. X
  1085. XJun  4 14:06 1986  diff of ./screen.c in /ccc/mcgregor/elm2/src and /ccc/mcgregXor/elm/src Page 1
  1086. X
  1087. X
  1088. X137,139d136
  1089. X< #ifdef UTS
  1090. X<     if (isatube) WriteScreen3270();
  1091. X< #endif UTS
  1092. X260,261c257,258
  1093. X<       dprint2(9,"start_highlight=%o, end_highlight=%o\n",
  1094. X<           start_highlight[0],end_highlight[0]);
  1095. X---
  1096. X>       dprint2(9,"start_highlight=%o, end_highlight=%o,
  1097. X>           start_highlight,end_highlight);
  1098. X
  1099. X
  1100. X
  1101. X
  1102. X
  1103. X
  1104. X
  1105. X
  1106. X
  1107. X
  1108. X
  1109. X
  1110. X
  1111. X
  1112. X
  1113. X
  1114. X
  1115. X
  1116. X
  1117. X
  1118. X
  1119. X
  1120. X
  1121. X
  1122. X
  1123. X
  1124. X
  1125. X
  1126. X
  1127. X
  1128. X
  1129. X
  1130. X
  1131. X
  1132. X
  1133. X
  1134. X
  1135. X
  1136. X
  1137. X
  1138. X
  1139. X
  1140. X
  1141. X
  1142. X
  1143. X
  1144. X
  1145. X
  1146. X
  1147. X
  1148. X
  1149. X
  1150. X
  1151. XJun  4 14:06 1986  diff of ./syscall.c in /ccc/mcgregor/elm2/src and /ccc/mcgreXgor/elm/src Page 1
  1152. X
  1153. X
  1154. X1c1,2
  1155. X< /**            syscall.c        **/
  1156. X---
  1157. X> #include <qsdefs.h>
  1158. X> #line 1 "syscall.q"
  1159. X3,4d3
  1160. X< /** These routines are used for user-level system calls, including the
  1161. X<     '!' command and the '|' commands...
  1162. X6,7d4
  1163. X<     (C) Copyright 1986 Dave Taylor
  1164. X< **/
  1165. X8a6,10
  1166. X>
  1167. X>
  1168. X>
  1169. X>
  1170. X>
  1171. X18,20d19
  1172. X<     /** spawn a subshell with either the specified command
  1173. X<         returns non-zero if screen rewrite needed
  1174. X<     **/
  1175. X21a21,23
  1176. X>
  1177. X>     
  1178. X>
  1179. X54,56c56
  1180. X<     /** execute 'string', setting uid to userid... **/
  1181. X<     /** if shell-type is "SH" /bin/sh is used regardless of the
  1182. X<         users shell setting.  Otherwise, "USER_SHELL" is sent **/
  1183. X---
  1184. X>     
  1185. X57a58,59
  1186. X>     
  1187. X>
  1188. X64c66
  1189. X<         if (isatube) qsclose();
  1190. X---
  1191. X>         if (isatube) qclose();
  1192. X67c69
  1193. X< #ifdef NO-VM        /* machine without virtual memory! */
  1194. X---
  1195. X> #ifdef NO-VM        
  1196. X72,73c74,75
  1197. X<       setuid(userid);    /* back to the normal user! */
  1198. X<       setgid(groupid);    /* and group id            */
  1199. X---
  1200. X>       setuid(userid);    
  1201. X>       setgid(groupid);    
  1202. X100c102
  1203. X<     /** pipe the tagged messages to the specified sequence.. **/
  1204. X---
  1205. X>     
  1206. X105c107
  1207. X<     message_list[0] = '\0';    /* NULL string to start... */
  1208. X---
  1209. X>     message_list[0] = '\0';    
  1210. X
  1211. X
  1212. X
  1213. X
  1214. X
  1215. X
  1216. X
  1217. XJun  4 14:06 1986  diff of ./syscall.c in /ccc/mcgregor/elm2/src and /ccc/mcgreXgor/elm/src Page 2
  1218. X
  1219. X
  1220. X107c109
  1221. X<     oldstat = header_table[current-1].status;    /* saved...      */
  1222. X---
  1223. X>     oldstat = header_table[current-1].status;    
  1224. X117c119
  1225. X<     header_table[current-1].status = oldstat;    /* ..and restored! */
  1226. X---
  1227. X>     header_table[current-1].status = oldstat;    
  1228. X155,156d156
  1229. X<     /** Print current message or tagged messages using 'printout'
  1230. X<         variable.  Error message iff printout not defined! **/
  1231. X157a158,159
  1232. X>     
  1233. X>
  1234. X167c169
  1235. X<     message_list[0] = '\0';    /* reset to null... */
  1236. X---
  1237. X>     message_list[0] = '\0';    
  1238. X169,170c171,172
  1239. X<     oldstat = header_table[current-1].status;    /* old one */
  1240. X<     header_table[current-1].status |= TAGGED;    /* tag it  */
  1241. X---
  1242. X>     oldstat = header_table[current-1].status;    
  1243. X>     header_table[current-1].status |= TAGGED;    
  1244. X179c181
  1245. X<     header_table[current-1].status = oldstat;    /* restored */
  1246. X---
  1247. X>     header_table[current-1].status = oldstat;    
  1248. X205c207
  1249. X<     unlink(filename);    /* remove da temp file! */
  1250. X---
  1251. X>     unlink(filename);    
  1252. X
  1253. X
  1254. X
  1255. X
  1256. X
  1257. X
  1258. X
  1259. X
  1260. X
  1261. X
  1262. X
  1263. X
  1264. X
  1265. X
  1266. X
  1267. X
  1268. X
  1269. X
  1270. X
  1271. X
  1272. X
  1273. X
  1274. X
  1275. X
  1276. X
  1277. X
  1278. X
  1279. X
  1280. X
  1281. X
  1282. END-OF-FILE
  1283.  
  1284. if [ "$filename" != "/dev/null" ]
  1285. then
  1286.   size=`wc -c < $filename`
  1287.  
  1288.   if [ $size != 6628 ]
  1289.   then
  1290.     echo $filename changed - should be 6628 bytes, not $size bytes
  1291.   fi
  1292.  
  1293.   chmod 666 $filename
  1294. fi
  1295.  
  1296. # ---------- file src/getopt.c ----------
  1297.  
  1298. filename="src/getopt.c"
  1299.  
  1300. if [ -f $filename ]
  1301. then
  1302.   echo File \"$filename\" already exists\!  Skipping...
  1303.   filename=/dev/null        # throw it away
  1304. else
  1305.   echo extracting file src/getopt.c...
  1306. fi
  1307.  
  1308. cat << 'END-OF-FILE' > $filename
  1309. /**            getopt.c            **/
  1310.  
  1311. /** starting argument parsing routine... 
  1312.  
  1313.     (C) Copyright 1986 Dave Taylor
  1314. **/
  1315.  
  1316. #ifndef NULL
  1317. # define NULL        0
  1318. #endif
  1319.  
  1320. #define DONE        0
  1321. #define ERROR        -1
  1322.  
  1323. char *optional_arg;            /* optional argument as we go */
  1324. int   opt_index;            /* argnum + 1 when we leave   */
  1325.  
  1326. /***********************
  1327.    Typical usage of this routine is exemplified by;
  1328.  
  1329.     register int c;
  1330.  
  1331.     while ((c = get_options(argc, argv, "ad:f:")) > 0) {
  1332.        switch (c) {
  1333.          case 'a' : arrow_cursor++;        break;
  1334.          case 'd' : debug = atoi(optional_arg);    break;
  1335.          case 'f' : strcpy(infile, optional_arg); 
  1336.                     mbox_specified = 2;  break;
  1337.         }
  1338.      }
  1339.  
  1340.      if (c == ERROR) {
  1341.        printf("Usage: %s [a] [-d level] [-f file] <names>\n\n", argv[0]);
  1342.        exit(1);
  1343.     }
  1344.  
  1345. ***********************/
  1346.  
  1347. int  _indx = 1, _argnum = 1;
  1348.  
  1349. int
  1350. get_options(argc, argv, options)
  1351. int argc;
  1352. char *argv[], *options;
  1353. {
  1354.     /** Returns the character argument next, and optionally instantiates 
  1355.         "argument" to the argument associated with the particular option 
  1356.     **/
  1357.     
  1358.     char        *word, *strchr();
  1359.  
  1360.     if (_argnum > argc) {    /* quick check first - no arguments! */
  1361.       opt_index = argc;
  1362.       return(DONE);
  1363.     }
  1364.  
  1365.     if (argv[_argnum] == NULL && _indx > 1) {    /* Sun compatability */
  1366.       _argnum++;
  1367.       _indx = 1;        /* zeroeth char is '-' */
  1368.     }
  1369.     else if (_indx >= strlen(argv[_argnum]) && _indx > 1) {
  1370.       _argnum++;
  1371.       _indx = 1;        /* zeroeth char is '-' */
  1372.     }
  1373.  
  1374.     if (_argnum > argc) {
  1375.       opt_index = _argnum; /* no more args */
  1376.       return(DONE);
  1377.     }
  1378.  
  1379.     if (_argnum == argc) {
  1380.       opt_index = _argnum;
  1381.       return(DONE);
  1382.     }
  1383.  
  1384.     if (argv[_argnum][0] != '-') {
  1385.       opt_index = _argnum;
  1386.       return(DONE);
  1387.     }
  1388.  
  1389.         word = strchr(options, argv[_argnum][_indx++]);
  1390.  
  1391.     if (strlen(word) == 0) 
  1392.       return(ERROR);
  1393.     
  1394.     if (word[1] == ':') {
  1395.  
  1396.       /** Two possibilities - either tailing end of this argument or the 
  1397.           next argument in the list **/
  1398.  
  1399.       if (_indx < strlen(argv[_argnum])) { /* first possibility */
  1400.         optional_arg = (char *) (argv[_argnum] + _indx);
  1401.         _argnum++;
  1402.         _indx = 1;
  1403.       }
  1404.       else {                /* second choice     */
  1405.         if (++_argnum >= argc) 
  1406.           return(ERROR);            /* no argument!!     */
  1407.  
  1408.         optional_arg = (char *) argv[_argnum++];
  1409.         _indx = 1;
  1410.       }
  1411.     }
  1412.  
  1413.     return((int) word[0]);
  1414. }
  1415. END-OF-FILE
  1416.  
  1417. if [ "$filename" != "/dev/null" ]
  1418. then
  1419.   size=`wc -c < $filename`
  1420.  
  1421.   if [ $size != 2253 ]
  1422.   then
  1423.     echo $filename changed - should be 2253 bytes, not $size bytes
  1424.   fi
  1425.  
  1426.   chmod 644 $filename
  1427. fi
  1428.  
  1429. if [ ! -d test ]
  1430. then
  1431.   echo creating directory test
  1432.   mkdir test
  1433. fi
  1434.  
  1435. # ---------- file test/test.mail ----------
  1436.  
  1437. filename="test/test.mail"
  1438.  
  1439. if [ -f $filename ]
  1440. then
  1441.   echo File \"$filename\" already exists\!  Skipping...
  1442.   filename=/dev/null        # throw it away
  1443. else
  1444.   echo extracting file test/test.mail...
  1445. fi
  1446.  
  1447. sed 's/^X//' << 'END-OF-FILE' > $filename
  1448. XFrom root Wed Oct 30 14:03:36 1985
  1449. X>From srmmail Wed Oct 30 14:10:08 1985  remote from veeger
  1450. X>From hplabs Wed Oct 30 14:00:16 1985 remote from hpcnof
  1451. X>From hpl-opus!poulton  Wed Oct 30 02:06:16 1985 remote from hplabs
  1452. XDate: Wed, 30 Oct 85 01:55:05 pst
  1453. XFrom: <hplabs!hpl-opus!poulton>
  1454. XReceived: by HP-VENUS id AA26352; Wed, 30 Oct 85 01:55:05 pst
  1455. XMessage-Id: <8510300955.AA26352@HP-VENUS>
  1456. XTo: hpcnou!dat
  1457. XSubject: Re: announce(1)
  1458. X
  1459. XThe announce I got was shar'd July 8.   NLEN was not defined in that
  1460. Xsource, just used.  LONG_SLEN is not defined in the newmail(1)
  1461. Xthat you sent me.  What system are you running on?
  1462. XMy s500 doesn't have these def's.
  1463. X
  1464. X    -> Monday, January 3rd: Call your mother
  1465. X
  1466. XAs to announce --> newmail: why the switch?
  1467. XSeems like both are useful, in different situations.
  1468. X
  1469. XKen Poulton
  1470. XHPL
  1471. X
  1472. X
  1473. X
  1474. X
  1475. XFrom root Wed Oct 30 14:03:39 1985
  1476. X>From srmmail Wed Oct 30 14:10:12 1985  remote from veeger
  1477. X>From hplabs Wed Oct 30 13:59:53 1985 remote from hpcnof
  1478. X>From fowler  Wed Oct 30 12:57:11 1985 remote from hplabs
  1479. XDate: Wed, 30 Oct 85 12:57:11 pst
  1480. XFrom: Greg Fowler <hplabs!fowler>
  1481. XReceived: by HP-VENUS id AA12562; Wed, 30 Oct 85 12:57:11 pst
  1482. XMessage-Id: <8510302057.AA12562@HP-VENUS>
  1483. XTo: mail-men@rochester
  1484. XSubject: Re: Summary of Network Mail Headers
  1485. XReferences: <36700044@hpcnof.UUCP>
  1486. XPriority: Most Urgent
  1487. X
  1488. XI believe your introduction referred to the uucp network.  usenet is the networXk news
  1489. Xsoftware mechanism and isn't a "network".
  1490. X
  1491. X    - > February 19, 1986
  1492. X    -
  1493. X    -    A longer test of the system
  1494. X    -
  1495. X
  1496. X    Greg
  1497. X
  1498. X
  1499. X
  1500. XFrom root Wed Oct 30 14:13:23 1985
  1501. X>From srmmail Wed Oct 30 14:20:08 1985  remote from veeger
  1502. X>From root Wed Oct 30 14:01:57 1985 remote from hpcnof
  1503. XTo: DCC@hplabs
  1504. XSubject: Log of backup tape #1
  1505. X
  1506. XFull Backup starting at Wed Oct 30 12:45:14 MST 1985
  1507. X
  1508. X
  1509. Xbacking up directories: 
  1510. X    ./users/fh ./users/rmd ./users/vince ./users/roberts ./users/row ./users/dt ./Xlost+found ./users/lost+found ./users/scb ./users/kevin ./users/du
  1511. X
  1512. X
  1513. X
  1514. X
  1515. X
  1516. XFrom root Wed Oct 30 15:33:24 1985
  1517. X>From srmmail Wed Oct 30 15:40:26 1985  remote from veeger
  1518. X>From root Wed Oct 30 15:37:17 1985 remote from hpcnof
  1519. XTo: root, uucp, taylor@hplabs.ARPA
  1520. XSubject: Log of backup tape #2
  1521. X
  1522. Xbacking up directories: 
  1523. X    ./users/fh ./users/rmd ./users/vince ./users/roberts ./users/row ./users/dt ./Xlost+found ./users/lost+found ./users/scb ./users/kevin ./users/du
  1524. X
  1525. X
  1526. X
  1527. X
  1528. Xbacking up directories: 
  1529. X    ./users/sbh ./users/ges ./users/cpb ./users/amy ./net ./users/root ./users/balXza ./dev ./users/remple ./users/jr ./users/mwr ./users/larryf
  1530. X
  1531. X
  1532. X
  1533. X
  1534. X
  1535. XFrom root Sun Dec  8 22:50:18 1985
  1536. X>From srmmail Mon Dec  9 00:50:05 1985 remote from veeger
  1537. X>From root Mon Dec  9 00:41:15 1985 remote from hpcnof
  1538. X>From JLarson.pa@Xerox.ARPA  Sun Dec  8 20:45:55 1985 remote from hplabs
  1539. XDate: 8 Dec 85 20:36:36 PST (Sunday)
  1540. XFrom: hplabs!JLarson.pa@Xerox.ARPA
  1541. XSubject: How's it going, anyway?
  1542. XTo: hpcnou!dat@HPLABS.ARPA (Dave Taylor)
  1543. XCc: JLarson.pa@Xerox.ARPA
  1544. X
  1545. XHow are things with you?  Could you send me that paper we were talking
  1546. Xabout?  
  1547. X
  1548. X    Thanks
  1549. X
  1550. XJohn Larson
  1551. XXerox Palo Alto Research Center
  1552. X3333 Coyote Hill Road
  1553. XPalo Alto, Ca  94304
  1554. X
  1555. X
  1556. X
  1557. X
  1558. XFrom root Wed Aug  7 19:58:30 1985
  1559. X>From uucp Wed Aug  7 19:55:12 1985  remote from veeger
  1560. X>From hplabs Wed Aug  7 19:48:10 1985 remote from hpcnof
  1561. X>From RICHER@SUMEX-AIM  Wed Aug  7 09:23:12 1985 remote from hplabs
  1562. XReceived: by HP-VENUS id AA18269; Wed, 7 Aug 85 09:11:48 pdt
  1563. XDate: Tue 6 Aug 85 09:12:37-PDT
  1564. XFrom: Mark Richer <hplabs!RICHER@SUMEX-AIM>
  1565. XReceived: by HP-VENUS via CSNET; 7 Aug 1985 09:11:37-PDT (Wed)
  1566. XReceived: from sumex-aim.arpa by csnet-relay.arpa id a015812; 6 Aug 85 12:14 EDXT
  1567. XTo: hpcnof!veeger!hpcnou!dat%hplabs.csnet@CSNET-RELAY
  1568. XVia:  CSNet; 7 Aug 85 9:11-PDT
  1569. XSubject: Re: AI in Education mailing list...
  1570. XCc: RICHER@SUMEX-AIM
  1571. XIn-Reply-To: <8508030243.AA27641@HP-VENUS>
  1572. XMessage-Id: <12132987812.61.RICHER@SUMEX-AIM.ARPA>
  1573. X
  1574. XI added you to aied.  This message may be of interest to you:
  1575. X
  1576. XArtificial Intelligence in Education Meeting at IJCAI 85
  1577. X---------- ------------ -- --------- ------- -- ----- --
  1578. X
  1579. XPlace: Math Sciences Auditorium (a.k.a. Math 4000A), UCLA campus
  1580. XTime: 6:30 pm, Tuesday, Aug. 20, 1985  (length: 1 - 1 1/4 hr)
  1581. X
  1582. XAgenda:
  1583. X    I have two speakers scheduled to make presentations that
  1584. Xshould stimulate questions and discussions:
  1585. X
  1586. X    (1) Short Announcements
  1587. X
  1588. X    (2) Jeff Bonar, Research Scientist, Learning Research and
  1589. X    Development Center (LRDC), University of Pittsburgh
  1590. X
  1591. X    --- on-going ICAI research projects at LRDC
  1592. X    --- dissemination of ICAI technology in the form of software
  1593. X    tools, workshops, written materials, and video tapes.
  1594. X
  1595. X    (3) Gary Fine, Product Engineering Manager, INTELLICORP,
  1596. X    formerly with a company producing CAI products, also graduate
  1597. X    work in ICAI  
  1598. X
  1599. X    --- bridging the gap between current ICAI technology and the
  1600. X    real world
  1601. X
  1602. X[IJCAI-85, the 9th International Joint Conference on Artificial
  1603. XIntelligence is being held at UCLA Campus, August 18-23, 1985.  This
  1604. Xconference is co-sponsered by the American Association for Artificial
  1605. XIntelligence (AAAI) this year, and I have been told by their office
  1606. Xthat only walk-in registration is available at this time.  For more
  1607. Xinformation, contact AAAI:  AAAI-OFFICE@SUMEX-AIM.ARPA
  1608. X                AAAI, 445 Burgess Drive, Menlo Park, CA 94025
  1609. X                or call (415) 328-3123]
  1610. X
  1611. XDirect questions on the AI in ED meeting (only) to Mark Richer,
  1612. XRICHER@SUMEX-AIM.ARPA
  1613. X-------
  1614. X
  1615. X
  1616. X
  1617. X
  1618. XFrom root Tue Sep 24 09:53:24 1985
  1619. X>From HPMAIL-gateway Tue Sep 24  9:46:47 1985  remote from veeger
  1620. X>From Simon_CINTZ_/_HPD600/TR  Tue Sep 24  9:46:47 1985  remote from hpmail
  1621. XDate:   Tue, 24 Sep 85  9:14:00 MDT
  1622. XFrom:   Simon_CINTZ_/_HPD600/TR  (Simon Cintz)
  1623. XSubject: ITF
  1624. XFrom:   Simon_CINTZ_/_HPD600/TR  (Simon Cintz)
  1625. XTo:     Dave_TAYLOR_/_HPF100/00
  1626. X
  1627. XDave -
  1628. X
  1629. XJust as one programming language doesn't suit the needs of
  1630. Xall programmers, one authoring facility will probably not
  1631. Xsuit the needs of all HP entities that require CBT -- at least
  1632. Xnot in the near future.  Of course, this is my personal opinion
  1633. Xand if I'm wrong, it won't be the first time.
  1634. X
  1635. XGood luck.
  1636. X
  1637. X
  1638. X                                           - Simon
  1639. X
  1640. XFrom root Mon Oct 21 10:43:37 1985
  1641. X>From srmmail Mon Oct 21 10:30:16 1985  remote from veeger
  1642. X>From root Mon Oct 21 10:28:58 1985 remote from hpcnof
  1643. X>From DLS.MDC%office-X.arpa@CSNET-RELAY  Mon Oct 21 01:57:05 1985 remote from hXplabs
  1644. XReceived: by HP-VENUS id AA17376; Mon, 21 Oct 85 01:57:05 pdt
  1645. XDate: 21 Oct 85 01:02 EDT
  1646. XFrom: Duane Stone / McDonnell Douglas / CSC-ASD <hplabs!DLS.MDC%office-1.arpa@CXSNET-RELAY>
  1647. XReceived: by HP-VENUS via CSNET; 21 Oct 1985 01:57:01-PDT (Mon)
  1648. XReceived: from office-1.arpa by CSNET-RELAY.ARPA id a019220; 21 Oct 85 1:18 EDTX
  1649. XTo: Dave Taylor <hpcnou!dat%hplabs.csnet@CSNET-RELAY>
  1650. XVia:  CSNet; 21 Oct 85 1:56-PDT
  1651. XSubject: Re: More Mail Headers...
  1652. XMessage-Id: <MDC-DLS-7W9CS@OFFICE-1>
  1653. XComment: Dave -- this is the body of the message I previously 'sent' to you viaX
  1654. X
  1655. Xa Journal.
  1656. X
  1657. XI might suggest re-wording the para on Author -- my associates might object to X
  1658. X'strange' -- something like:
  1659. X
  1660. X   This is used to credit the original author, or to give credit on article 
  1661. X   excerpts (from Newspapers, magazines, books, etc).
  1662. X
  1663. XOne field which I forgot is:
  1664. X
  1665. X   Length:  This is computed when the message is sent and gives the recipients X
  1666. X   an estimate of the number of pages in the document.
  1667. X
  1668. X   Example:
  1669. X
  1670. X      Length: 6 pages [estimate]
  1671. X
  1672. XAccess:
  1673. X
  1674. X   Used to declare whether a Journal item should be Public or Private (to thoseX
  1675. X   that are on the distribution list or Extended Access list)
  1676. X
  1677. X   Example:
  1678. X
  1679. X      Access: Unrestricted
  1680. X
  1681. XAcknowledge-Delivery:
  1682. X
  1683. X   Used to request the system mailer send back a message when it has 
  1684. X   successfully delivered the item.
  1685. X
  1686. X   Example:
  1687. X
  1688. X      Acknowledge-Delivery: Requested
  1689. X
  1690. XAcknowledge-Receipt:
  1691. X
  1692. X   Used to to ask the recipient to acknowledge receipt of the message.
  1693. X
  1694. X   Example:
  1695. X
  1696. X   Acknowledge-Receipt: Requested
  1697. X
  1698. XAddendum-To:
  1699. X
  1700. X   A pointer to a previously submitted Journal item.
  1701. X
  1702. X   Example:
  1703. X
  1704. X      Addendum-To: <ASD,1234,>
  1705. X
  1706. XDelivery-Timing:
  1707. X
  1708. X   Used by the sender to indicate when the message should be submitted to the 
  1709. X   mailer.
  1710. X
  1711. X      Examples:
  1712. X
  1713. X         Rush:       -   immediate
  1714. X
  1715. X         Soon:       -   as soon as possible
  1716. X
  1717. X         Defer:      -   overnight
  1718. X
  1719. X         Start-Delivery: DATE TIME
  1720. X
  1721. X         Stop-Delivery:  DATE TIME (if not yet delivered)
  1722. X
  1723. XDisposition-Code:
  1724. X
  1725. X   Used by the system to group Journal items into one of several classes for 
  1726. X   eventual archive to tape and as an indicator of how long the archive tapes 
  1727. X   should be retained.
  1728. X
  1729. X   Example:
  1730. X
  1731. X      Disposition-Code: Temporary (2 years)
  1732. X
  1733. XExtended-access:
  1734. X
  1735. X   Used with private Journal items to allow access by other than those on the 
  1736. X   distribution list.
  1737. X
  1738. X   Example:
  1739. X
  1740. X      Extended-access: ASD.MDC
  1741. X
  1742. XLocation:
  1743. X
  1744. X   Used to submit the message to the Journal.  The adressees receive a short 
  1745. X   citation with other header fields and a "Location:" field pointing to a fileX
  1746. X   in an electronic library.
  1747. X
  1748. X   Example:
  1749. X
  1750. X      Location: <MDC,1234,>
  1751. X
  1752. XPart-Of:
  1753. X
  1754. X   A pointer to a previously submitted Journal item.
  1755. X
  1756. X   Example:
  1757. X
  1758. X      Part-Of: <MDC,1234,>
  1759. X
  1760. XRoute-To:
  1761. X
  1762. X   Used to send a message "in-turn" to addressees in the "To:" field -- as 
  1763. X   opposed to the broadcast method of delivery where everyone gets the message X
  1764. X   "simultaneously".  Any addresses in the "Cc:" field receive a copy of the 
  1765. X   message each time it is passed from one adressee to the next in the "To:" 
  1766. X   field.
  1767. X
  1768. X   Example:
  1769. X
  1770. X      Routed-to: {addresses in To field}
  1771. X
  1772. XSigned:
  1773. X
  1774. X   Created when the user employs the Sign command; used to electronically sign X
  1775. X   a message.  It affixes a signature-block to a message.  A "Verify Signature"X
  1776. X   command is available to recipients that lets them find out if anyone has 
  1777. X   changed the body of the message since the message was signed.
  1778. X
  1779. X   Example:
  1780. X
  1781. X          SIGNED
  1782. X      
  1783. X      Duane L. Stone
  1784. X      App. Dev. Mgr.
  1785. X
  1786. XSupersedes:
  1787. X
  1788. X   A pointer to a previously submitted Journal item.
  1789. X
  1790. X   Example:
  1791. X
  1792. X      Supersedes: <MDC,1234,>
  1793. X
  1794. X
  1795. X--- last line of the file --
  1796. END-OF-FILE
  1797.  
  1798. if [ "$filename" != "/dev/null" ]
  1799. then
  1800.   size=`wc -c < $filename`
  1801.  
  1802.   if [ $size != 9977 ]
  1803.   then
  1804.     echo $filename changed - should be 9977 bytes, not $size bytes
  1805.   fi
  1806.  
  1807.   chmod 644 $filename
  1808. fi
  1809.  
  1810. # ---------- file test/test.notes ----------
  1811.  
  1812. filename="test/test.notes"
  1813.  
  1814. if [ -f $filename ]
  1815. then
  1816.   echo File \"$filename\" already exists\!  Skipping...
  1817.   filename=/dev/null        # throw it away
  1818. else
  1819.   echo extracting file test/test.notes...
  1820. fi
  1821.  
  1822. cat << 'END-OF-FILE' > $filename
  1823. /***** hpfloat:net.micro.68K / barrett /  2:39 pm  Dec 16, 1985*/
  1824. Does anyone here at this site know anything about hang-gliding? 
  1825.  
  1826. I am thinking of learning to hang-glide, but am afraid of heights.  I
  1827. do fly light planes and love the hairiest roller coaster rides available
  1828. however.  My main question is "is there a way to learn to hang-glide 
  1829. gradually?"  I have seen some films of people learning on big sand dunes
  1830. an such before leaping off of cliffs with the things.  
  1831.  
  1832. Dave Barrett
  1833. hpfcla!barrett
  1834. /* ---------- */
  1835. /***** hpcnof:fsd.rec / hpfcla!ajs /  5:57 pm  Dec 16, 1985*/
  1836. > Does anyone here at this site know anything about hang-gliding? 
  1837.  
  1838. Yeah.  Don't waste your time, don't waste your money, don't risk your life.
  1839.  
  1840. > I am thinking of learning to hang-glide, but am afraid of heights.
  1841.  
  1842. I wasn't, but it still got me a broken arm.
  1843.  
  1844. > My main question is "is there a way to learn to hang-glide gradually?"
  1845.  
  1846. Probably not (yet).  Five years ago, simulators were in practice non-
  1847. existent.  We got twenty seconds hanging in a triangular control bar
  1848. with a person pushing.  Next stop, rocky slopes, real gliders, and cheap
  1849. walkie-talkies.
  1850.  
  1851. You'd be amazed how easy it is to injure yourself.  It's the nature of
  1852. the hobby.  People with plenty of experience die doing it every day,
  1853. due to circumstances often beyond their control.  There are better ways
  1854. to get thrills.
  1855.  
  1856. Alan
  1857. /* ---------- */
  1858. /***** hpcnof:fsd.rec / hpfcms!mpm /  8:58 pm  Dec 16, 1985*/
  1859.  
  1860. >You'd be amazed how easy it is to injure yourself.  It's the nature of
  1861. >the hobby.  People with plenty of experience die doing it every day,
  1862. >due to circumstances often beyond their control.  There are better ways
  1863. >to get thrills.
  1864. >Alan
  1865.  
  1866.      I haven't done any hang-gliding myself, but I would like to try it
  1867. some day.  (I have a moderate fear of heights; it depends on the altitude
  1868. and the apparent stability of my "perch".)
  1869.  
  1870.      I read (or heard) that MOST hang-gliding accidents fall into two
  1871. categories:
  1872.  
  1873.      1) novices attempt something beyond their experience (like jumping
  1874.     off a tall building after one lesson on a gently sloped hill),
  1875.  
  1876.      2) experts attempt VERY dramatic stuff (like jumping off El
  1877.     Capitan in unpredictable thermal up- and down- drafts).
  1878.  
  1879.      Please note:  Alan Silverstein doesn't fall in EITHER category.  I
  1880. took some sport parachuting lessons a few years ago.  It turned out to be
  1881. quite safe GIVEN ADEQUATE TRAINING as I had at the time.  I suspect the
  1882. same would hold true for hang-gliding (or rapelling, or ice climbing, or
  1883. ...).  The best way to find out if you can overcome your fears is by con-
  1884. fronting them in a safe and supportive environment.
  1885.  
  1886.      My recommendation:  check out any "school" before you sign up.  Ask
  1887. about their safety record, the terrain where they offer lessons, amount of
  1888. "ground school" training before first "flight", etc.  Above all, make sure
  1889. that you TRUST any prospective teacher.  Even if you have no logical reason
  1890. to distrust someone, don't try something like this unless you trust them.
  1891. (This is where your rational mind needs to work with your intuition.)
  1892. Otherwise you could easily get hurt.
  1893.  
  1894.      This is likely to be unknown territory for you, so be prepared and
  1895. you will likely have a more enjoyable (and safe) experience.  Of course,
  1896. there is ALWAYS the chance for an accident.
  1897.  
  1898.     -- Mike "no I wasn't crazy at the time; I WANTED to do it" McCarthy
  1899.        hpfcla!mpm
  1900. /* ---------- */
  1901. /***** hpcnof:fsd.rec / dat / 12:12 pm  Dec 19, 1985*/
  1902. >> Does anyone here at this site know anything about hang-gliding? 
  1903. >Yeah.  Don't waste your time, don't waste your money, don't risk your life.
  1904.  
  1905.     Strong stuff!  I think you're out on a limb this time, Alan.
  1906. I've known lots of people who've hang-glided and never gotten hurt.
  1907. (and we're talking the La Jolla cliffs in San Diego!!) (they also
  1908. think it's the best 'high' in the world (and they've tried some
  1909. pretty strange things to compare!))
  1910.  
  1911. >> I am thinking of learning to hang-glide, but am afraid of heights.
  1912. >I wasn't, but it still got me a broken arm.
  1913.  
  1914.     Fine.  So I broke my arm a long time ago jumping off a bunk
  1915. bed.  Does this mean that bunk beds are too dangerous and that I 
  1916. shouldn't ever sleep in one???
  1917.  
  1918.     The point is that anything you do is dangerous and that the
  1919. way to minimize the danger is to take things gradually and only 
  1920. progress when you feel comfortable with your current level of learning.
  1921. At the same time realize that even sitting in a chair in a warm room
  1922. could be dangerous, so don't be so foolishly optimistic to think that
  1923. you cannot get seriously hurt hang-gliding.
  1924.  
  1925.     On the other hand - if you want to go for it - GO FOR IT!!!
  1926.  
  1927.             -- Dave "Cheap Thrills, Inc." Taylor
  1928. /* ---------- */
  1929. /***** hpcnof:fsd.rec / hpfcmp!rjn / 11:33 pm  Dec 16, 1985*/
  1930. re: hang gliding
  1931.  
  1932. I am a licensed [so what] pilot in powered  aircraft and  sailplanes.  I was
  1933. taking  hang  gliding  (HG)  instruction  four years ago (prior to moving to
  1934. Colorado).  I gave it up when I moved here.  My impressions:
  1935.  
  1936. * If your  introduction  to piloting flying machines is via HG, you will not
  1937.   have enough  understanding of aerodynamics to safely operate your craft in
  1938.   calm or steady-wind conditions.
  1939.  
  1940. * HGs which are controlled by weight  shifting do not have adequate  control
  1941.   authority   for   normal   conditions,   unless   you  have  lots  of  the
  1942.   aforementioned  understanding and fly only in ideal  conditions.  HGs with
  1943.   3-axis control offer a little more margin.
  1944.  
  1945. * HGs are typically operated close to the ground.  No HG designs have enough
  1946.   control  authority  to handle  gusty  conditions.  You can  safely  land a
  1947.   parachute in conditions  which are dangerous for HG  operation.  Flying in
  1948.   gusty  conditions  is the most  popular  way to crash a HG.  If you  think
  1949.   jumping is dangerous, don't take up HG.  (I used to room with a jumpmaster
  1950.   and have made one jump myself.  I think jumping is safer.)
  1951.  
  1952. * HGs operated at higher altitudes (away from ground  reference) suffer from
  1953.   lack of  instrumentation.  It is easy to enter a spiral dive, spin or deep
  1954.   stall (luff the sail on Rogallo machines)  without  instruments or lots of
  1955.   experience.  Spiral dives usually  overstress  the airframe; the resulting
  1956.   collection of parts crashes.
  1957.  
  1958. If you  insist on K-Mart  aviating,  I suggest a 2-place  ultra-light  (with
  1959. parachute), a good instructor and a calm day.  At least the ground is level.
  1960. Bring earplugs.
  1961.  
  1962. Bob Niland  TN-226-4014   HP-UX: hpfcla!rjn    DESK: rjn (hpfcla) /HP4000/UX
  1963. /* ---------- */
  1964. /***** hpcnof:fsd.rec / hpfloat!jim /  9:10 am  Dec 17, 1985*/
  1965. Try flying across the waves on a windsurfer!  I once met a guy from
  1966. Denver who said he had tried them all--hang gliding, sky diving.  Windsurfing
  1967. offered just as much thrill with almost no risk.
  1968.  
  1969. The crash landings are rather painless.  I've gotten 5 feet of air right
  1970. here in Colorado.
  1971.  
  1972.         "Jumping Jim" Tear
  1973.  
  1974. /* ---------- */
  1975. /***** hpcnof:fsd.rec / hpfcmt!ron /  7:56 am  Dec 17, 1985*/
  1976.  
  1977.  
  1978. I also am a "regular" aircraft (and sailplane) pilot.
  1979.  
  1980. I have not tried hang gliding however I have a fairly close friend who 
  1981. was into it before he totally demolished his craft. He was only bruised
  1982. by the impact but came away considerably more careful about his sports.
  1983.  
  1984. Besides the previously mentioned drawbacks I would like to mention the 
  1985. following:
  1986.  
  1987. A perfect landing consists of
  1988.  
  1989.    (a) Correct airspeed
  1990.    (b) Level wings ( tolerance to prevent wingtip dragging)
  1991.    (c) Correct yaw alignment   (within tolerance of landing gear)
  1992.    (d) Correct pitch
  1993.    (e) Correct rate of descent  (within tolerance of landing gear)
  1994.    (f) Correct altitude
  1995.    (g) Correct groundspeed (within tolerance of landing gear) 
  1996.  
  1997. Consider that the landing gear on an HG is your legs and gear collapse
  1998. is fairly common due to the low maximum speed for the gear and the 
  1999. airspeed being right in that range at touchdown.
  2000. Consider also that even calm air has some "breezes" going. 
  2001. Add to the "breezes" the fact that your control authority relative to the
  2002. velocity of the breezes is poor and you can wind up with all the ingredients
  2003. for a face plant.
  2004.  
  2005. Now to moderate the above, the idea of simple flight appeals greatly to
  2006. me. Unfortunately my personal risk-taking threshold is below the minimum
  2007. risk for this sport.  
  2008. I agree with Bob, try ultra-lights if you MUST . At least they have wheels.
  2009.  
  2010.  
  2011. Ron Miller
  2012.  
  2013.  
  2014. "Show me a country where the newspapers are filled with good news
  2015. and I'll show you a country where the jails are filled with good people."
  2016.                     -<I forgot>
  2017.  
  2018. Service Engineering  (Hardware Support)
  2019. Hewlett-Packard Co.
  2020. Ft. Collins Systems Div. Home of the HP 9000 Series 200,300 & 500
  2021. Ft. Collins Colorado
  2022. 303-226-3800
  2023.  
  2024. at: {ihnp4}hpfcla!ron
  2025. /* ---------- */
  2026. /***** hpcnof:fsd.rec / hpfcla!ajs /  6:36 pm  Dec 19, 1985*/
  2027. > Strong stuff!  I think you're out on a limb this time, Alan.
  2028. > I've known lots of people who've hang-glided and never gotten hurt.
  2029.  
  2030. Yes, but, --
  2031.  
  2032. > Fine.  So I broke my arm a long time ago jumping off a bunk
  2033. > bed.  Does this mean that bunk beds are too dangerous and that I 
  2034. > shouldn't ever sleep in one???
  2035.  
  2036. I'll be more explicit (and just as strong).  Let's say sleeping is a
  2037. zero (epsilon?) on the risk scale, and flying in a commercial aircraft
  2038. is 1, and driving a car, oh, I'd guess about a 4, and parachuting maybe
  2039. a 6, and SCUBA diving must be maybe a 7 or 8 then, comparable (?) with
  2040. climbing Fourteeners.  Based on my experience with it, I'd rank hang
  2041. gliding at around a 12 or 15.  Don't risk your life.
  2042.  
  2043. One thing I discovered is that being under a "kite" feels very different
  2044. from how you might guess while watching someone fly.  Not nearly as
  2045. comfortable (until airborne); very exposed.  Some people are naturals at
  2046. it; some (like me) are not.  If you are the former, and you are lucky,
  2047. and it appeals to you, you'll go do it anyway, no matter what I or Dave
  2048. say about it; good luck to you.
  2049.  
  2050. But, if you are the latter, you'll likely injure yourself seriously
  2051. trying to learn, because there isn't much margin for error outside a
  2052. simulator.  Look, I was gung-ho, being trained by a "professional"
  2053. training school, determined to overcome inexperience, ignored warnings
  2054. from concerned friends, was certain I could do it safely, paid close
  2055. attention to instructions, studied the subject intensely, and when I
  2056. crashed, I'd been in the air about five seconds, was about ten feet off
  2057. the ground, and was amazed that I'd actually broken anything.  A very
  2058. sobering experience.
  2059.  
  2060. On the way to the hospital, the trainer doing the driving informed me
  2061. that someone was seriously injured in their classes about once a month.
  2062.  
  2063. Gee, Dave, I guess I must be "out on a limb", incapable of giving advice
  2064. on the subject, because I survived the crash.  :-)
  2065.  
  2066. Alan
  2067. /* ---------- */
  2068. /***** hpcnof:fsd.rec / hpfcde!anny /  2:28 pm  Dec 31, 1985*/
  2069. WARNING:  Severe Base Note  D  r   i    f      t
  2070.  
  2071. <. . . and driving a car, oh, I'd guess about a 4, and parachuting maybe
  2072. <a 6, and SCUBA diving must be maybe a 7 or 8 then, . . .
  2073.  
  2074. Come on Alan!  SCUBA diving more dangerous than parachuting?  Maybe if your
  2075. parachuting off a jump tower versus SCUBA diving alone on the Great Barrier
  2076. Reef at night carring shark bait making wounded fish sounds. . . ;-)
  2077.  
  2078. After all, the FIRST time you parachute, you have to jump out of a PLANE! (/.\)
  2079. In the SKY!  You can SCUBA dive in a pool or a shallow lake or inlet.
  2080. If something goes wrong in the water, your buddy's there to help.  If 
  2081. something goes wrong in the sky, so long . . .
  2082.  
  2083. Just defending what I consider to be a fun and safe sport!
  2084.  
  2085. Anny (low altitude (4' or less) sports for me!) Randel
  2086. /* ---------- */
  2087. /***** hpcnof:fsd.rec / hpfcla!ajs /  9:27 am  Jan  2, 1986*/
  2088. > Come on Alan!  SCUBA diving more dangerous than parachuting?
  2089.  
  2090. Forgive me, I was just guessing, to make a point.  I don't know the
  2091. actual statistics, but you're probably right -- if you measure accidents
  2092. per hour.  On the other hand, if you measure accidents per jump or dive,
  2093. it wouldn't surprise me if the rates were similar.  Lotsa people go
  2094. diving without enough training, but skydiving requires decent training
  2095. and the accident rate is surprisingly low.
  2096.  
  2097. Alan "pick your poison" Silverstein
  2098. /* ---------- */
  2099. /***** hpcnof:fsd.rec / hpfcdc!donn /  9:32 am  Jan  3, 1986*/
  2100. The problem with SCUBA diving is the fact that "fly by nites" can
  2101. afford to get into the business.  A reputable dive shop will not
  2102. let you rent a tank unless you have a NAUI card (or ==) (and they'll hold
  2103. it while you have the tanks).  However there are always some who
  2104. will not do this, and some clown tries diving without essentially
  2105. any training ("Gee, I can swim, so I can dive.") and gets into
  2106. trouble.  It's much tougher to be a "fly by night" (or anytime)
  2107. when you need an airplane and a pilot's license.  Actually, the
  2108. accident rate for people with any significant training *and* who
  2109. are doing something more-or-less reasonable is not bad.  (Diving
  2110. below 150ft (or maybe less) is like starting a jump at 50000 feet:
  2111. it might work, but good luck unless you know what you're doing. 
  2112. The problem is that there isn't much reason to start at 50000 feet,
  2113. but there's a lot of interesting and valuable stuff below 150.)
  2114.  
  2115. I like to dive (tropical saltwater only, so I don't do it much),
  2116. and since one of the graduation exercises is diving while someone
  2117. is *trying* to make you screw up (albeit in a pool where there's
  2118. someone to fish you out), you learn to handle problems.  If you're
  2119. gutsy, try the NAUI *instructors* class: the graduation from that
  2120. is a open-water dive with known defective equipment!
  2121.  
  2122. Donn
  2123. /* ---------- */
  2124. END-OF-FILE
  2125.  
  2126. if [ "$filename" != "/dev/null" ]
  2127. then
  2128.   size=`wc -c < $filename`
  2129.  
  2130.   if [ $size != 13582 ]
  2131.   then
  2132.     echo $filename changed - should be 13582 bytes, not $size bytes
  2133.   fi
  2134.  
  2135.   chmod 644 $filename
  2136. fi
  2137.  
  2138. # ---------- file test/test.empty ----------
  2139.  
  2140. filename="test/test.empty"
  2141.  
  2142. if [ -f $filename ]
  2143. then
  2144.   echo File \"$filename\" already exists\!  Skipping...
  2145.   filename=/dev/null        # throw it away
  2146. else
  2147.   echo extracting file test/test.empty...
  2148. fi
  2149.  
  2150. cat << 'END-OF-FILE' > $filename
  2151. END-OF-FILE
  2152.  
  2153. if [ "$filename" != "/dev/null" ]
  2154. then
  2155.   size=`wc -c < $filename`
  2156.  
  2157.   if [ $size != 0 ]
  2158.   then
  2159.     echo $filename changed - should be 0 bytes, not $size bytes
  2160.   fi
  2161.  
  2162.   chmod 644 $filename
  2163. fi
  2164.  
  2165. if [ ! -d utils ]
  2166. then
  2167.   echo creating directory utils
  2168.   mkdir utils
  2169. fi
  2170.  
  2171. # ---------- file utils/answer.c ----------
  2172.  
  2173. filename="utils/answer.c"
  2174.  
  2175. if [ -f $filename ]
  2176. then
  2177.   echo File \"$filename\" already exists\!  Skipping...
  2178.   filename=/dev/null        # throw it away
  2179. else
  2180.   echo extracting file utils/answer.c...
  2181. fi
  2182.  
  2183. cat << 'END-OF-FILE' > $filename
  2184. /**            answer.c            **/
  2185.  
  2186. /** This program is a phone message transcription system, and
  2187.     is designed for secretaries and the like, to allow them to
  2188.     painlessly generate electronic mail instead of paper forms.
  2189.  
  2190.     Note: this program ONLY uses the local alias file, and does not
  2191.       even read in the system alias file at all.
  2192.  
  2193.     (C) Copyright 1986, Dave Taylor
  2194.  
  2195. **/
  2196.  
  2197. #include <stdio.h>
  2198. #include <fcntl.h>
  2199. #include <ctype.h>
  2200.  
  2201. #include "defs.h"            /* ELM system definitions      */
  2202.  
  2203. #define  ELM        "elm"        /* where the elm program lives */
  2204.  
  2205. static char ident[] = { WHAT_STRING };
  2206.  
  2207. struct alias_rec user_hash_table  [MAX_UALIASES];
  2208.  
  2209. int user_data;        /* fileno of user data file   */
  2210.  
  2211. char *expand_group(), *get_alias_address(), *get_token();
  2212.  
  2213. main()
  2214. {
  2215.     FILE *fd;
  2216.     char *address, buffer[LONG_STRING], tempfile[SLEN];
  2217.     char  name[SLEN], user_name[SLEN];
  2218.     int   msgnum = 0, eof;
  2219.     
  2220.     read_alias_files();
  2221.  
  2222.     while (1) {
  2223.       if (msgnum > 9999) msgnum = 0;
  2224.     
  2225.       printf("\n-------------------------------------------------------------------------------\n");
  2226.  
  2227. prompt:   printf("\nMessage to: ");
  2228.       gets(user_name, SLEN);
  2229.       if (user_name == NULL)
  2230.         goto prompt;
  2231.       
  2232.       if ((strcmp(user_name,"quit") == 0) ||
  2233.           (strcmp(user_name,"exit") == 0) ||
  2234.           (strcmp(user_name,"done") == 0) ||
  2235.           (strcmp(user_name,"bye")  == 0))
  2236.          exit(0);
  2237.  
  2238.       if (translate(user_name, name) == 0)
  2239.         goto prompt;
  2240.  
  2241.       address = get_alias_address(name, 1, 0);
  2242.  
  2243.       if (address == NULL || strlen(address) == 0) {
  2244.         printf("Sorry, could not find '%s' [%s] in list!\n", user_name, 
  2245.            name);
  2246.         goto prompt;
  2247.       }
  2248.  
  2249.       sprintf(tempfile, "%s%d", temp_file, msgnum++);
  2250.  
  2251.       if ((fd = fopen(tempfile,"w")) == NULL)
  2252.         exit(printf("** Fatal Error: could not open %s to write\n",
  2253.          tempfile));
  2254.  
  2255.  
  2256.       printf("\nEnter message for %s ending with a blank line.\n\n", 
  2257.          user_name);
  2258.  
  2259.       fprintf(fd,"\n\n");
  2260.  
  2261.       do {
  2262.        printf("> ");
  2263.        if (! (eof = (gets(buffer, SLEN) == NULL))) 
  2264.          fprintf(fd, "%s\n", buffer);
  2265.       } while (! eof && strlen(buffer) > 0);
  2266.     
  2267.       fclose(fd);
  2268.  
  2269.       sprintf(buffer, "(%s -s \"While You Were Out\" %s < %s ; %s %s) &", 
  2270.               ELM, address, tempfile, remove, tempfile);
  2271.  
  2272.       system(buffer);
  2273.     }
  2274. }
  2275.  
  2276. int
  2277. translate(fullname, name)
  2278. char *fullname, *name;
  2279. {
  2280.     /** translate fullname into name..
  2281.            'first last'  translated to first_initial - underline - last
  2282.            'initial last' translated to initial - underline - last
  2283.         Return 0 if error.
  2284.     **/
  2285.     register int i, lastname = 0;
  2286.  
  2287.     for (i=0; i < strlen(fullname); i++) {
  2288.  
  2289.       if (isupper(fullname[i]))
  2290.          fullname[i] = fullname[i] - 'A' + 'a';
  2291.  
  2292.       if (fullname[i] == ' ') 
  2293.         if (lastname) {
  2294.           printf(
  2295.           "** Can't have more than 'FirstName LastName' as address!\n");
  2296.           return(0);
  2297.         }
  2298.         else
  2299.           lastname = i+1;
  2300.     
  2301.     }
  2302.  
  2303.     if (lastname) 
  2304.       sprintf(name, "%c_%s", fullname[0], (char *) fullname + lastname);
  2305.     else
  2306.       strcpy(name, fullname);
  2307.  
  2308.     return(1);
  2309. }
  2310.  
  2311.         
  2312. read_alias_files()
  2313. {
  2314.     /** read the user alias file **/
  2315.  
  2316.     char fname[SLEN];
  2317.     int  hash;
  2318.  
  2319.     sprintf(fname,  "%s/.alias_hash", getenv("HOME")); 
  2320.  
  2321.     if ((hash = open(fname, O_RDONLY)) == -1) 
  2322.       exit(printf("** Fatal Error: Could not open %s!\n", fname));
  2323.  
  2324.     read(hash, user_hash_table, sizeof user_hash_table);
  2325.     close(hash);
  2326.  
  2327.     sprintf(fname,  "%s/.alias_data", getenv("HOME")); 
  2328.  
  2329.     if ((user_data = open(fname, O_RDONLY)) == -1) 
  2330.       return;
  2331. }
  2332.  
  2333. char *get_alias_address(name, mailing, depth)
  2334. char *name;
  2335. int   mailing, depth;
  2336. {
  2337.     /** return the line from either datafile that corresponds 
  2338.         to the specified name.  If 'mailing' specified, then
  2339.         fully expand group names.  Returns NULL if not found.
  2340.         Depth is the nesting depth, and varies according to the
  2341.         nesting level of the routine.  **/
  2342.  
  2343.     static char buffer[VERY_LONG_STRING];
  2344.     int    loc;
  2345.  
  2346.     if ((loc = find(name, user_hash_table, MAX_UALIASES)) >= 0) {
  2347.       lseek(user_data, user_hash_table[loc].byte, 0L);
  2348.       get_line(user_data, buffer, LONG_STRING);
  2349.       if (buffer[0] == '!' && mailing)
  2350.         return( (char *) expand_group(buffer, depth));
  2351.       else
  2352.         return( (char *) buffer);
  2353.     }
  2354.     
  2355.     return( (char *) NULL);
  2356. }
  2357.  
  2358. char *expand_group(members, depth)
  2359. char *members;
  2360. int   depth;
  2361. {
  2362.     /** given a group of names separated by commas, this routine
  2363.         will return a string that is the full addresses of each
  2364.         member separated by spaces.  Depth is the current recursion
  2365.         depth of the expansion (for the 'get_token' routine) **/
  2366.  
  2367.     char   buffer[VERY_LONG_STRING];
  2368.     char   buf[LONG_STRING], *word, *address, *bufptr;
  2369.  
  2370.     strcpy(buf, members);     /* parameter safety! */
  2371.     buffer[0] = '\0';    /* nothing in yet!   */
  2372.     bufptr = (char *) buf;    /* grab the address  */
  2373.     depth++;        /* one more deeply into stack */
  2374.  
  2375.     while ((word = (char *) get_token(bufptr, "!, ", depth)) != NULL) {
  2376.       if ((address = (char *) get_alias_address(word, 1, depth)) == NULL) {
  2377.         fprintf(stderr, "Alias %s not found for group expansion!", word);
  2378.         return( (char *) NULL);
  2379.       }
  2380.       else if (strcmp(buffer,address) != 0) {
  2381.         sprintf(buffer,"%s %s", buffer, address);
  2382.       }
  2383.  
  2384.       bufptr = NULL;
  2385.     }
  2386.  
  2387.     return( (char *) buffer);
  2388. }
  2389.  
  2390. int
  2391. find(word, table, size)
  2392. char *word;
  2393. struct alias_rec table[];
  2394. int size;
  2395. {
  2396.     /** find word and return loc, or -1 **/
  2397.     register int loc;
  2398.     
  2399.     if (strlen(word) > 20)
  2400.       exit(printf("Bad alias name: %s.  Too long.\n", word));
  2401.  
  2402.     loc = hash_it(word, size);
  2403.  
  2404.     while (strcmp(word, table[loc].name) != 0) {
  2405.       if (table[loc].name[0] == '\0') 
  2406.         return(-1);
  2407.       loc = (loc + 1) % size; 
  2408.     }
  2409.  
  2410.     return(loc);
  2411. }
  2412.  
  2413. int
  2414. hash_it(string, table_size)
  2415. char *string;
  2416. int   table_size;
  2417. {
  2418.     /** compute the hash function of the string, returning
  2419.         it (mod table_size) **/
  2420.  
  2421.     register int i, sum = 0;
  2422.     
  2423.     for (i=0; string[i] != '\0'; i++)
  2424.       sum += (int) string[i];
  2425.  
  2426.     return(sum % table_size);
  2427. }
  2428.  
  2429. get_line(fd, buffer)
  2430. int fd;
  2431. char *buffer;
  2432. {
  2433.     /* read from file fd.  End read upon reading either 
  2434.        EOF or '\n' character (this is where it differs 
  2435.        from a straight 'read' command!) */
  2436.  
  2437.     register int i= 0;
  2438.     char     ch;
  2439.  
  2440.     while (read(fd, &ch, 1) > 0)
  2441.       if (ch == '\n' || ch == '\r') {
  2442.         buffer[i] = 0;
  2443.         return;
  2444.       }
  2445.       else
  2446.         buffer[i++] = ch;
  2447. }
  2448.  
  2449. print_long(buffer, init_len)
  2450. char *buffer;
  2451. int   init_len;
  2452. {
  2453.     /** print buffer out, 80 characters (or less) per line, for
  2454.         as many lines as needed.  If 'init_len' is specified, 
  2455.         it is the length that the first line can be.
  2456.     **/
  2457.  
  2458.     register int i, loc=0, space, length; 
  2459.  
  2460.     /* In general, go to 80 characters beyond current character
  2461.        being processed, and then work backwards until space found! */
  2462.  
  2463.     length = init_len;
  2464.  
  2465.     do {
  2466.       if (strlen(buffer) > loc + length) {
  2467.         space = loc + length;
  2468.         while (buffer[space] != ' ' && space > loc + 50) space--;
  2469.         for (i=loc;i <= space;i++)
  2470.           putchar(buffer[i]);
  2471.         putchar('\n');
  2472.         loc = space;
  2473.       }
  2474.       else {
  2475.         for (i=loc;i < strlen(buffer);i++)
  2476.           putchar(buffer[i]);
  2477.         putchar('\n');
  2478.         loc = strlen(buffer);
  2479.       }
  2480.       length = 80;
  2481.     } while (loc < strlen(buffer));
  2482. }
  2483.  
  2484. /****
  2485.      The following is a newly chopped version of the 'strtok' routine
  2486.   that can work in a recursive way (up to 20 levels of recursion) by
  2487.   changing the character buffer to an array of character buffers....
  2488. ****/
  2489.  
  2490. #define MAX_RECURSION        20        /* up to 20 deep recursion */
  2491.  
  2492. #undef  NULL
  2493. #define NULL            (char *) 0    /* for this routine only   */
  2494.  
  2495. extern int strspn();
  2496. extern char *strpbrk();
  2497.  
  2498. char *get_token(string, sepset, depth)
  2499. char *string, *sepset;
  2500. int  depth;
  2501. {
  2502.  
  2503.     /** string is the string pointer to break up, sepstr are the
  2504.         list of characters that can break the line up and depth
  2505.         is the current nesting/recursion depth of the call **/
  2506.  
  2507.     register char    *p, *q, *r;
  2508.     static char    *savept[MAX_RECURSION];
  2509.  
  2510.     /** is there space on the recursion stack? **/
  2511.  
  2512.     if (depth >= MAX_RECURSION) {
  2513.      fprintf(stderr,"Error: Get_token calls nested greated than %d deep!\n",
  2514.             MAX_RECURSION);
  2515.      exit(1);
  2516.     }
  2517.  
  2518.     /* set up the pointer for the first or subsequent call */
  2519.     p = (string == NULL)? savept[depth]: string;
  2520.  
  2521.     if(p == 0)        /* return if no tokens remaining */
  2522.         return(NULL);
  2523.  
  2524.     q = p + strspn(p, sepset);    /* skip leading separators */
  2525.  
  2526.     if (*q == '\0')        /* return if no tokens remaining */
  2527.         return(NULL);
  2528.  
  2529.     if ((r = strpbrk(q, sepset)) == NULL)    /* move past token */
  2530.         savept[depth] = 0;    /* indicate this is last token */
  2531.     else {
  2532.         *r = '\0';
  2533.         savept[depth] = ++r;
  2534.     }
  2535.     return(q);
  2536. }
  2537. END-OF-FILE
  2538.  
  2539. if [ "$filename" != "/dev/null" ]
  2540. then
  2541.   size=`wc -c < $filename`
  2542.  
  2543.   if [ $size != 8370 ]
  2544.   then
  2545.     echo $filename changed - should be 8370 bytes, not $size bytes
  2546.   fi
  2547.  
  2548.   chmod 666 $filename
  2549. fi
  2550.  
  2551. echo end of this archive file....
  2552. exit 0
  2553.  
  2554.