home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / x / volume21 / pan / part06 < prev    next >
Encoding:
Text File  |  1993-11-08  |  44.4 KB  |  1,586 lines

  1. Newsgroups: comp.sources.x
  2. From: jeff@tasslehoff.interlan.com (Jeff Bailey)
  3. Subject: v21i042:  pan - A post a note program, Part06/06
  4. Message-ID: <1993Nov9.000800.11051@sparky.sterling.com>
  5. X-Md4-Signature: 9d380255a7f9dca06aaed88c15f06dfe
  6. Sender: chris@sparky.sterling.com (Chris Olson)
  7. Organization: Sterling Software
  8. Date: Tue, 9 Nov 1993 00:08:00 GMT
  9. Approved: chris@sterling.com
  10.  
  11. Submitted-by: jeff@tasslehoff.interlan.com (Jeff Bailey)
  12. Posting-number: Volume 21, Issue 42
  13. Archive-name: pan/part06
  14. Environment: X11, OpenLook, XView
  15. Supersedes: pan: Volume 16, Issue 137-142
  16.  
  17. ---- Cut Here and feed the following to sh ----
  18. #!/bin/sh
  19. # This is part 06 of a multipart archive
  20. # ============= pan3.0/work.c ==============
  21. if test ! -d 'pan3.0'; then
  22.     echo 'x - creating directory pan3.0'
  23.     mkdir 'pan3.0'
  24. fi
  25. if test -f 'pan3.0/work.c' -a X"$1" != X"-c"; then
  26.     echo 'x - skipping pan3.0/work.c (File already exists)'
  27. else
  28. echo 'x - extracting pan3.0/work.c (Text)'
  29. sed 's/^X//' << 'SHAR_EOF' > 'pan3.0/work.c' &&
  30. X/*
  31. XPost A Note V3.0
  32. XCopyright (c) 1993, Jeffrey W. Bailey
  33. XAll rights reserved.
  34. X
  35. XPermission is granted to distribute this program in exact, complete
  36. Xsource form, which includes this copyright notice, as long as no fee
  37. Xother than media and distribution cost is charged.
  38. X
  39. XThis program may not be used in whole, or in part, in any other manner
  40. Xwithout prior written permission from the author.
  41. X
  42. XThis program may not be distributed in modified form without prior
  43. Xwritten permission from the author.  In other words, patches may be
  44. Xdistributed, but modified source may not be distributed.
  45. X
  46. XIf there are any questions, comments or suggestions, the author may be
  47. Xcontacted at:
  48. X
  49. X    jeff@rd1.interlan.com
  50. X
  51. X    or
  52. X
  53. X    Jeffrey Bailey
  54. X    Racal-Datacom, Inc.
  55. X    Mail Stop E-110
  56. X    1601 N. Harrison Parkway
  57. X    Sunrise, FL  33323-2899
  58. X*/
  59. X
  60. X#include "pan.h"
  61. X
  62. Xextern int errno;
  63. Xextern char *sys_errlist[];
  64. X
  65. Xextern char *re_comp();
  66. X
  67. Xextern FILE *errfp;
  68. X
  69. X/*
  70. X    Build a list of notes with subjects matching the provided RE.
  71. X    If notvisible is set, only finds hidden or veiled matches.
  72. X
  73. X    Return number of matches.
  74. X    Return -1 for bad RE.
  75. X    Return -2 for memory alloc failure.
  76. X*/
  77. Xw_matchingnotes(root, re, notvisible)
  78. X    struct LLM_root *root;
  79. X    char *re;
  80. X    int  notvisible;
  81. X    {
  82. X    int  count = 0;
  83. X    struct SubDir *sp;
  84. X    struct Note *np;
  85. X    struct Note **npp;
  86. X    char tbuf [MAXSEARCHLEN + 1];
  87. X
  88. X    LLM_init(root, sizeof(struct Note *));
  89. X    if(re_comp(re) != NULL)
  90. X        {
  91. X        return(-1);
  92. X        }
  93. X    sp = (struct SubDir *) LLM_first(&subdir_rt);
  94. X    while(sp != NULL)
  95. X        {
  96. X        np = (struct Note *) LLM_first(&sp->note_rt);
  97. X        while(np != NULL)
  98. X            {
  99. X            strcpy(tbuf, np->ntitle);
  100. X            if(strlen(tbuf) == 0) strcpy(tbuf, NOTITLE);
  101. X            if(re_exec(tbuf) == 1)
  102. X                {
  103. X                if((!notvisible) ||
  104. X                   (notvisible && np->state != Visible))
  105. X                    {
  106. X                    npp = (struct Note **) LLM_add(root);
  107. X                    if(npp == NULL)
  108. X                        {
  109. X                        return(-2);
  110. X                        }
  111. X                    count++;
  112. X                    *npp = np;
  113. X                    }
  114. X                }
  115. X            np = (struct Note *) LLM_next(&sp->note_rt);
  116. X            }
  117. X        sp = (struct SubDir *) LLM_next(&subdir_rt);
  118. X        }
  119. X    return(count);
  120. X    }
  121. X
  122. Xw_exposenote(np, display)
  123. X    struct Note *np;
  124. X    int  display;
  125. X    {
  126. X    buildnote(np, display, FALSE);
  127. X    xv_set(np->title, PANEL_VALUE, np->ntitle, NULL);
  128. X    set_frame_title(np, np->ntitle);
  129. X    reseticon(np);
  130. X    np->state = Visible;
  131. X    update(np);
  132. X    updateinfo(np, FORCE);
  133. X    }
  134. X
  135. Xw_hidenote(np)
  136. X    struct Note *np;
  137. X    {
  138. X    np->state = Hidden;
  139. X    update(np);
  140. X    updateinfo(np, FORCE);
  141. X    textsw_reset(np->textsw, 0, 0);
  142. X    put_win(np);
  143. X    np->mapped = 0;
  144. X    }
  145. X
  146. Xw_veilnote(np)
  147. X    struct Note *np;
  148. X    {
  149. X    np->state = Veiled;
  150. X    update(np);
  151. X    updateinfo(np, NOFORCE);
  152. X    textsw_reset(np->textsw, 0, 0);
  153. X    put_win(np);
  154. X    np->mapped = 0;
  155. X    }
  156. X
  157. Xw_popupxy(x, y, width, height, spacing)
  158. X    int *x, *y;
  159. X    int  width, height, spacing;
  160. X    {
  161. X    Display *dpy;
  162. X    Xv_Screen screen;
  163. X    int  screen_num;
  164. X    int  screen_height;
  165. X    int  screen_width;
  166. X    Rect rect;
  167. X
  168. X    dpy = (Display *) xv_get(main_frame, XV_DISPLAY);
  169. X    screen = (Xv_Screen) xv_get(main_frame, XV_SCREEN);
  170. X    screen_num = xv_get(screen, SCREEN_NUMBER);
  171. X    screen_height = DisplayHeight(dpy, screen_num);
  172. X    screen_width = DisplayWidth(dpy, screen_num);
  173. X    frame_get_rect(main_frame, &rect);
  174. X    rect.r_left += spacing;
  175. X    if((rect.r_left + width) > (screen_width - spacing))
  176. X        rect.r_left = screen_width - width - spacing;
  177. X    if((rect.r_top + rect.r_height + 2 * spacing + height) <
  178. X       screen_height)
  179. X        rect.r_top += (rect.r_height + spacing);
  180. X    else
  181. X        rect.r_top -= (height + 2 * spacing);
  182. X    *x = rect.r_left;
  183. X    *y = rect.r_top;
  184. X    }
  185. X
  186. X/*
  187. X    Creates a new folder, with error reporting to display OR logfile.
  188. X    Calls routines to check name validity and to make the directory.
  189. X*/
  190. Xw_newfolder(name, display)
  191. X    char *name;
  192. X    int  display;
  193. X    {
  194. X    struct SubDir *sp;
  195. X    Menu_item mi;
  196. X    int  result;
  197. X
  198. X    if(w_validfolder(name, display) < 0) return;
  199. X
  200. X    if((result = w_makefolder(name)) != 0)
  201. X        {
  202. X        if(display)
  203. X            {
  204. X            notice_prompt(main_frame, NULL,
  205. X                NOTICE_MESSAGE_STRINGS,
  206. X                    "Cannot create the new folder",
  207. X                    name,
  208. X                    sys_errlist[result],
  209. X                    NULL,
  210. X                NOTICE_BUTTON_YES, "Acknowledge",
  211. X                NOTICE_NO_BEEPING, noticenobeep,
  212. X                NULL);
  213. X            }
  214. X        else
  215. X            {
  216. X            fprintf(errfp, "%s:  Cannot create new folder {%s}:  %s\n",
  217. X                   myname, name, sys_errlist[result]);
  218. X            }
  219. X        return;
  220. X        }
  221. X    sp = (struct SubDir *) LLM_add(&subdir_rt);
  222. X    if(sp == NULL)
  223. X        {
  224. X        int  t_errno;
  225. X
  226. X        t_errno = errno;
  227. X        if(display)
  228. X            {
  229. X            notice_prompt(main_frame, NULL,
  230. X                NOTICE_MESSAGE_STRINGS,
  231. X                    "Cannot create the new folder",
  232. X                    name,
  233. X                    sys_errlist[t_errno],
  234. X                    NULL,
  235. X                NOTICE_BUTTON_YES, "Acknowledge",
  236. X                NOTICE_NO_BEEPING, noticenobeep,
  237. X                NULL);
  238. X            }
  239. X        else
  240. X            {
  241. X            fprintf(errfp,
  242. X                "%s:  Cannot create new folder {%s}, memory problem %s\n",
  243. X                myname, name, sys_errlist[t_errno]);
  244. X            }
  245. X        return;
  246. X        }
  247. X    memset((char *)sp, 0, sizeof(struct SubDir));
  248. X    strcpy(sp->subdir, name);
  249. X    LLM_init(&sp->note_rt, sizeof(struct Note));
  250. X    mi = xv_create(NULL, MENUITEM,
  251. X        MENU_STRING, sp->subdir,
  252. X        MENU_NOTIFY_PROC, newnote,
  253. X        NULL);
  254. X    xv_set(main_newnote, MENU_APPEND_ITEM, mi, NULL);
  255. X    mi = xv_create(NULL, MENUITEM,
  256. X        MENU_STRING, sp->subdir,
  257. X        MENU_GEN_PULLRIGHT, gen_exposemenu,
  258. X        NULL);
  259. X    xv_set(main_expose, MENU_APPEND_ITEM, mi, NULL);
  260. X    mi = xv_create(NULL, MENUITEM,
  261. X        MENU_STRING, sp->subdir,
  262. X        MENU_GEN_PULLRIGHT, gen_prtmenu,
  263. X        NULL);
  264. X    xv_set(main_print, MENU_APPEND_ITEM, mi, NULL);
  265. X
  266. X    refresh_popups();
  267. X    }
  268. X
  269. X/*
  270. X    Determine if a folder name is valid.
  271. X    Returns  0 - ok
  272. X            -1 - failed
  273. X*/
  274. Xw_validfolder(name, display)
  275. X    char *name;
  276. X    int  display;
  277. X    {
  278. X    char *cp;
  279. X    int  result;
  280. X
  281. X    result = 0;
  282. X    trim(name);
  283. X    if(*name == 0) result = -1;
  284. X    cp = name;
  285. X    if(*cp == '.') result = -2;
  286. X    while(*cp)
  287. X        {
  288. X        if(*cp == '/') result = -3;
  289. X        if(*cp == ' ' || *cp == '\t') result = -4;
  290. X        cp++;
  291. X        }
  292. X
  293. X    switch(result)
  294. X        {
  295. X        case 0 : /* ok */
  296. X            break;
  297. X        case -1 : /* no name */
  298. X            if(display)
  299. X                {
  300. X                notice_prompt(main_frame, NULL,
  301. X                    NOTICE_MESSAGE_STRINGS,
  302. X                        "No folder name entered",
  303. X                        NULL,
  304. X                    NOTICE_BUTTON_YES, "Acknowledge",
  305. X                    NOTICE_NO_BEEPING, noticenobeep,
  306. X                    NULL);
  307. X                }
  308. X            else
  309. X                {
  310. X                fprintf(errfp, "%s:  No folder name supplied\n", myname);
  311. X                }
  312. X            return(-1);
  313. X            break;
  314. X        case -2 : /* begins with a . */
  315. X            if(display)
  316. X                {
  317. X                notice_prompt(main_frame, NULL,
  318. X                    NOTICE_MESSAGE_STRINGS,
  319. X                        "Folder name cannot begin with a '.'",
  320. X                        NULL,
  321. X                    NOTICE_BUTTON_YES, "Acknowledge",
  322. X                    NOTICE_NO_BEEPING, noticenobeep,
  323. X                    NULL);
  324. X                }
  325. X            else
  326. X                {
  327. X                fprintf(errfp, "%s:  Folder name cannot begin with a '.'\n",
  328. X                        myname);
  329. X                }
  330. X            return(-1);
  331. X            break;
  332. X        case -3 : /* contains a / */
  333. X            if(display)
  334. X                {
  335. X                notice_prompt(main_frame, NULL,
  336. X                    NOTICE_MESSAGE_STRINGS,
  337. X                        "Folder name cannot contain a '/'",
  338. X                        NULL,
  339. X                    NOTICE_BUTTON_YES, "Acknowledge",
  340. X                    NOTICE_NO_BEEPING, noticenobeep,
  341. X                    NULL);
  342. X                }
  343. X            else
  344. X                {
  345. X                fprintf(errfp, "%s:  Folder name cannot contain a '/'\n",
  346. X                        myname);
  347. X                }
  348. X            return(-1);
  349. X            break;
  350. X        case -4 : /* contains whitespace */
  351. X            if(display)
  352. X                {
  353. X                notice_prompt(main_frame, NULL,
  354. X                    NOTICE_MESSAGE_STRINGS,
  355. X                        "Folder name cannot contain spaces or tabs",
  356. X                        NULL,
  357. X                    NOTICE_BUTTON_YES, "Acknowledge",
  358. X                    NOTICE_NO_BEEPING, noticenobeep,
  359. X                    NULL);
  360. X                }
  361. X            else
  362. X                {
  363. X                fprintf(errfp,
  364. X                        "%s:  Folder name cannot contain spaces or tabs\n",
  365. X                        myname);
  366. X                }
  367. X            return(-1);
  368. X            break;
  369. X        }
  370. X    return(0);
  371. X    }
  372. X
  373. X/*
  374. X    Makes a new folder (sub-directory).
  375. X    Returns  0 - ok
  376. X             x = errno
  377. X*/
  378. Xw_makefolder(name)
  379. X    char *name;
  380. X    {
  381. X    if(mkdir(name, 0700) < 0)
  382. X        return(errno);
  383. X    else
  384. X        return(0);
  385. X    }
  386. X
  387. X/*
  388. X    Moves a note from one folder to another
  389. X    Returns  0 - ok
  390. X            -1 = error
  391. X*/
  392. Xw_movenote(src_sp, dst_sp, np, display)
  393. X    struct SubDir *src_sp, *dst_sp;
  394. X    struct Note *np;
  395. X    int  display;
  396. X    {
  397. X    struct Note *tn;
  398. X    char src[MAXSUBDIR + 1];
  399. X    char dst[MAXSUBDIR + 1];
  400. X    char buf[MAXBUFLEN];
  401. X    char buf2[MAXBUFLEN];
  402. X
  403. X    strcpy(src, src_sp->subdir);
  404. X    strcpy(dst, dst_sp->subdir);
  405. X    trim(src);
  406. X    trim(dst);
  407. X    if(strcmp(src, dst) == 0)
  408. X        {
  409. X        if(display)
  410. X            {
  411. X            notice_prompt(main_frame, NULL,
  412. X                NOTICE_MESSAGE_STRINGS,
  413. X                    "Source and destination folders cannot be the same",
  414. X                    NULL,
  415. X                NOTICE_BUTTON_YES, "Acknowledge",
  416. X                NOTICE_NO_BEEPING, noticenobeep,
  417. X                NULL);
  418. X            }
  419. X        else
  420. X            {
  421. X            fprintf(errfp, "%s:  Move note failed:  Source and destination folders cannot be the same: %s\n",
  422. X                    myname, src);
  423. X            }
  424. X        return(-1);
  425. X        }
  426. X
  427. X    sprintf(buf, "%s/%s", src, np->basename);
  428. X    sprintf(buf2, "%s/%s", dst, np->basename);
  429. X    if(rename(buf, buf2) < 0)
  430. X        {
  431. X        if(display)
  432. X            {
  433. X            notice_prompt(main_frame, NULL,
  434. X                NOTICE_MESSAGE_STRINGS,
  435. X                    "Note move failed",
  436. X                    sys_errlist[errno],
  437. X                    NULL,
  438. X                NOTICE_BUTTON_YES, "Acknowledge",
  439. X                NOTICE_NO_BEEPING, noticenobeep,
  440. X                NULL);
  441. X            }
  442. X        else
  443. X            {
  444. X            fprintf(errfp, "%s:  Note move failed: {%s:%s} to %s\n", myname,
  445. X                    src, np->title, dst);
  446. X            }
  447. X        return(-1);
  448. X        }
  449. X    sprintf(buf, "%s/%s.info", src, np->basename);
  450. X    sprintf(buf2, "%s/%s.info", dst, np->basename);
  451. X    if(rename(buf, buf2) < 0)
  452. X        {
  453. X        if(display)
  454. X            {
  455. X            notice_prompt(main_frame, NULL,
  456. X                NOTICE_MESSAGE_STRINGS,
  457. X                    "Note move failed",
  458. X                    sys_errlist[errno],
  459. X                    NULL,
  460. X                NOTICE_BUTTON_YES, "Acknowledge",
  461. X                NOTICE_NO_BEEPING, noticenobeep,
  462. X                NULL);
  463. X            }
  464. X        else
  465. X            {
  466. X            fprintf(errfp, "%s:  Note move failed: {%s:%s} to %s\n", myname,
  467. X                    src, np->title, dst);
  468. X            }
  469. X        return(-1);
  470. X        }
  471. X    tn = (struct Note *) add_sorted(&dst_sp->note_rt, np->ntitle);
  472. X    if(tn == NULL)
  473. X        {
  474. X        if(display)
  475. X            {
  476. X            notice_prompt(main_frame, NULL,
  477. X                NOTICE_MESSAGE_STRINGS,
  478. X                    "Note move failed - Memory allocation failure",
  479. X                    sys_errlist[errno],
  480. X                    NULL,
  481. X                NOTICE_BUTTON_YES, "Acknowledge",
  482. X                NOTICE_NO_BEEPING, noticenobeep,
  483. X                NULL);
  484. X            }
  485. X        else
  486. X            {
  487. X            fprintf(errfp, "%s:  Note move failed (memory allocation failure %s): {%s:%s} to %s\n",
  488. X                    myname, sys_errlist[errno], src, np->title, dst);
  489. X            }
  490. X        /* Best attempt to fix things */
  491. X        (void) rename(buf2, buf);
  492. X        sprintf(buf, "%s/%s", src, np->basename);
  493. X        sprintf(buf2, "%s/%s", dst, np->basename);
  494. X        (void) rename(buf2, buf);
  495. X        return(-1);
  496. X        }
  497. X    memcpy((char *)tn, (char *)np, sizeof(struct Note));
  498. X    LLM_delete(&(np->sp->note_rt), (char *)np);
  499. X    tn->sp = dst_sp;
  500. X    if(tn->mapped)
  501. X        {
  502. X        xv_set(tn->title, PANEL_CLIENT_DATA, tn, NULL);
  503. X        xv_set(tn->hide, PANEL_CLIENT_DATA, tn, NULL);
  504. X        xv_set(tn->actionmenu, MENU_CLIENT_DATA, tn, NULL);
  505. X        }
  506. X    return(0);
  507. X    }
  508. X
  509. X/*
  510. X    Best attempt to create a new note.
  511. X        sp       - SubDir for new note
  512. X        state    - Visible, Hidden, or Veiled
  513. X        rect     - Location & size (optional, may be NULL)
  514. X        title    - Note title (optional, may be NULL)
  515. X        textfile - Path of file for initial contents (optional, may be NULL)
  516. X        display  - ERRONDISPLAY or ERRINLOG
  517. X*/
  518. Xw_newnote(sp, state, rect, title, textfile, display)
  519. X    struct SubDir *sp;
  520. X    NoteState state;
  521. X    Rect *rect;
  522. X    char *title;
  523. X    char *textfile;
  524. X    int  display;
  525. X    {
  526. X    int  adjust;
  527. X    int  x, y, w, h;
  528. X    struct Note *np;
  529. X    FILE *fp;
  530. X    char fname[MAXBUFLEN];
  531. X    /* get good pos for new note */
  532. X    if(rect == NULL)
  533. X        {
  534. X        if(notewidth == -1 || noteheight == -1)
  535. X            {
  536. X            w_popupxy(&x, &y, DEFWIDTH, DEFHEIGHT, DEFSPACING);
  537. X            adjust = TRUE; /* width will be adjusted */
  538. X            h = DEFHEIGHT;
  539. X            w = DEFWIDTH; /* set for safety's sake */
  540. X            }
  541. X        else
  542. X            {
  543. X            adjust = FALSE; /* width will NOT be adjusted */
  544. X            h = noteheight;
  545. X            w = notewidth;
  546. X            w_popupxy(&x, &y, w, h, DEFSPACING);
  547. X            }
  548. X        }
  549. X    else
  550. X        {
  551. X        adjust = FALSE;
  552. X        x = rect->r_left;
  553. X        y = rect->r_top;
  554. X        w = rect->r_width;
  555. X        h = rect->r_height;
  556. X        }
  557. X    np = (struct Note *)add_sorted(&sp->note_rt,
  558. X        title == NULL ? NOTITLE : title);
  559. X    if(np == NULL)
  560. X        {
  561. X        if(display)
  562. X            {
  563. X            notice_prompt(main_frame, NULL,
  564. X                NOTICE_MESSAGE_STRINGS,
  565. X                    "Internal failure - memory allocation failure",
  566. X                    NULL,
  567. X                NOTICE_BUTTON_YES, "Acknowledge",
  568. X                NOTICE_NO_BEEPING, noticenobeep,
  569. X                NULL);
  570. X            }
  571. X        else
  572. X            {
  573. X            fprintf(errfp,
  574. X                "%s:  Internal failure - memory allocation failure\n", myname);
  575. X            }
  576. X        return;
  577. X        }
  578. X    memset((char *)np, 0, sizeof(struct Note));
  579. X    sprintf(np->basename, NOTENAM, time(NULL), notecount++);
  580. X    np->sp = sp;
  581. X    np->crttime = time(NULL);
  582. X    np->state = state;
  583. X    np->rect.r_top = y;
  584. X    np->rect.r_left = x;
  585. X    np->rect.r_width = w;
  586. X    np->rect.r_height = h;
  587. X    if(title == NULL)
  588. X        strcpy(np->ntitle, NOTITLE);
  589. X    else
  590. X        strcpy(np->ntitle, title);
  591. X    /* Make the file with 0 length */
  592. X    makename(fname, np);
  593. X    fp = fopen(fname, "w");
  594. X    if(fp != NULL) fclose(fp);
  595. X    if(state == Visible)
  596. X        {
  597. X        if(!buildnote(np, display, adjust)) return;
  598. X        xv_set(np->title, PANEL_VALUE, np->ntitle, NULL);
  599. X        set_frame_title(np, np->ntitle);
  600. X        reseticon(np);
  601. X        }
  602. X    if(textfile != NULL)
  603. X        {
  604. X        Textsw_status status;
  605. X
  606. X        xv_set(np->textsw,
  607. X            TEXTSW_STATUS, &status,
  608. X            TEXTSW_INSERT_FROM_FILE, textfile,
  609. X            TEXTSW_FIRST, 0,
  610. X            NULL);
  611. X        if(status != TEXTSW_STATUS_OKAY)
  612. X            {
  613. X            if(display)
  614. X                {
  615. X                notice_prompt(main_frame, NULL,
  616. X                    NOTICE_MESSAGE_STRINGS,
  617. X                        "Text subwindow insert from file failed",
  618. X                        textfile,
  619. X                        NULL,
  620. X                    NOTICE_BUTTON_YES, "Acknowledge",
  621. X                    NOTICE_NO_BEEPING, noticenobeep,
  622. X                    NULL);
  623. X                }
  624. X            else
  625. X                {
  626. X                fprintf(errfp,
  627. X                    "%s:  Text subwindow insert from file %s failed\n",
  628. X                    myname, textfile);
  629. X                }
  630. X            }
  631. X        }
  632. X
  633. X    update(np);
  634. X    updateinfo(np, FORCE);
  635. X    refresh_popups();
  636. X    }
  637. X
  638. Xw_printnote(np, display)
  639. X    struct Note *np;
  640. X    int  display;
  641. X    {
  642. X    int  pid;
  643. X    struct stat st;
  644. X    char *cp;
  645. X    char fname[MAXBUFLEN];
  646. X    char envtitle[MAXBUFLEN];
  647. X    char envfname[MAXBUFLEN];
  648. X
  649. X    makename(fname, np);
  650. X    if(stat(fname, &st) < 0)
  651. X        {
  652. X        if(display)
  653. X            {
  654. X            notice_prompt(main_frame, NULL,
  655. X                NOTICE_MESSAGE_STRINGS,
  656. X                    "The selected note is not accessible (no contents)",
  657. X                    fname,
  658. X                    sys_errlist[errno],
  659. X                    NULL,
  660. X                NOTICE_BUTTON_YES, "Acknowledge",
  661. X                NOTICE_NO_BEEPING, noticenobeep,
  662. X                NULL);
  663. X            }
  664. X        else
  665. X            {
  666. X            fprintf(errfp,
  667. X              "%s:  The selected note is not accessible (no contents)\n\t%s\n",
  668. X              myname, sys_errlist[errno]);
  669. X            }
  670. X        return;
  671. X        }
  672. X    switch(pid = fork())
  673. X        {
  674. X        case -1 :
  675. X            if(display)
  676. X                {
  677. X                notice_prompt(main_frame, NULL,
  678. X                    NOTICE_MESSAGE_STRINGS,
  679. X                        "Couldn't fork a new process (internal error)",
  680. X                        sys_errlist[errno],
  681. X                        NULL,
  682. X                    NOTICE_BUTTON_YES, "Acknowledge",
  683. X                    NOTICE_NO_BEEPING, noticenobeep,
  684. X                    NULL);
  685. X                }
  686. X            else
  687. X                {
  688. X                fprintf(errfp,
  689. X                  "%s:  Couldn't fork a new process (internal error): %s\n",
  690. X                  myname, sys_errlist[errno]);
  691. X                }
  692. X            return;
  693. X            break;
  694. X        case  0 :
  695. X            cp = defaults_get_string(resources[RES_PCOMMAND].a,
  696. X                 resources[RES_PCOMMAND].b, RESDEF_PCOMMAND);
  697. X            sprintf(envtitle, "NOTETITLE=%s", np->ntitle);
  698. X            sprintf(envfname, "FILE=%s", fname);
  699. X            putenv(envtitle);
  700. X            putenv(envfname);
  701. X            execl("/bin/sh", "sh", "-c", cp, NULL);
  702. X            _exit(0);
  703. X            break;
  704. X        default :
  705. X            (void) notify_set_wait3_func(main_frame, 
  706. X                child_death, pid);
  707. X            break;
  708. X        }
  709. X    }
  710. SHAR_EOF
  711. chmod 0644 pan3.0/work.c ||
  712. echo 'restore of pan3.0/work.c failed'
  713. Wc_c="`wc -c < 'pan3.0/work.c'`"
  714. test 19226 -eq "$Wc_c" ||
  715.     echo 'pan3.0/work.c: original size 19226, current size' "$Wc_c"
  716. fi
  717. # ============= pan3.0/folder.c ==============
  718. if test -f 'pan3.0/folder.c' -a X"$1" != X"-c"; then
  719.     echo 'x - skipping pan3.0/folder.c (File already exists)'
  720. else
  721. echo 'x - extracting pan3.0/folder.c (Text)'
  722. sed 's/^X//' << 'SHAR_EOF' > 'pan3.0/folder.c' &&
  723. X/*
  724. XPost A Note V3.0
  725. XCopyright (c) 1993, Jeffrey W. Bailey
  726. XAll rights reserved.
  727. X
  728. XPermission is granted to distribute this program in exact, complete
  729. Xsource form, which includes this copyright notice, as long as no fee
  730. Xother than media and distribution cost is charged.
  731. X
  732. XThis program may not be used in whole, or in part, in any other manner
  733. Xwithout prior written permission from the author.
  734. X
  735. XThis program may not be distributed in modified form without prior
  736. Xwritten permission from the author.  In other words, patches may be
  737. Xdistributed, but modified source may not be distributed.
  738. X
  739. XIf there are any questions, comments or suggestions, the author may be
  740. Xcontacted at:
  741. X
  742. X    jeff@rd1.interlan.com
  743. X
  744. X    or
  745. X
  746. X    Jeffrey Bailey
  747. X    Racal-Datacom, Inc.
  748. X    Mail Stop E-110
  749. X    1601 N. Harrison Parkway
  750. X    Sunrise, FL  33323-2899
  751. X*/
  752. X
  753. X#include "pan.h"
  754. X
  755. X#include <X11/X.h>
  756. X#include <X11/Xutil.h>
  757. X
  758. Xextern int errno;
  759. Xextern char *sys_errlist[];
  760. X
  761. Xint cf_resize_proc();
  762. X
  763. Xstatic Panel_item appbutton;
  764. X
  765. Xcreatefolder(menu, mitem)
  766. X    Menu menu;
  767. X    Menu_item mitem;
  768. X    {
  769. X    Rect rect, *prect;
  770. X    Panel_item pitem;
  771. X    int  x, y;
  772. X    Panel folder_panel;
  773. X    static XClassHint chint;
  774. X
  775. X    w_popupxy(&x, &y, FLDRWIDTH, FLDRHEIGHT, FLDRSPACING);
  776. X    folder_mitem = mitem;
  777. X    folder_frame = xv_create(main_frame, FRAME_CMD,
  778. X                           XV_LABEL, "Create Folder",
  779. X                           XV_X, x,
  780. X                           XV_Y, y,
  781. X                           FRAME_NO_CONFIRM, TRUE,
  782. X                           FRAME_DONE_PROC, folderdone,
  783. X                           WIN_EVENT_PROC, cf_resize_proc,
  784. X                           WIN_CONSUME_EVENTS,
  785. X                               WIN_RESIZE,
  786. X                               NULL,
  787. X                           NULL);
  788. X    if(folder_frame == NULL)
  789. X        {
  790. X        notice_prompt(main_frame, NULL,
  791. X            NOTICE_MESSAGE_STRINGS,
  792. X                "Unable to create sub-frame (internal error)",
  793. X                NULL,
  794. X            NOTICE_BUTTON_YES, "Acknowledge",
  795. X            NOTICE_NO_BEEPING, noticenobeep,
  796. X            NULL);
  797. X        return;
  798. X        }
  799. X
  800. X    /* Set up the X class since xview doesn't */
  801. X    chint.res_name = "pan";
  802. X    chint.res_class = "Pan";
  803. X    XSetClassHint((Display *)xv_get(folder_frame, XV_DISPLAY),
  804. X        xv_get(folder_frame, XV_XID), &chint);
  805. X
  806. X    folder_panel = (Panel) xv_get(folder_frame, FRAME_CMD_PANEL);
  807. X    xv_set(folder_panel, WIN_RETAINED, FALSE, NULL);
  808. X
  809. X    folder_item =  xv_create(folder_panel, PANEL_TEXT,
  810. X                 PANEL_LABEL_STRING, "New Folder:",
  811. X                 PANEL_VALUE, "",
  812. X                 PANEL_VALUE_DISPLAY_LENGTH, MAXSUBDIR,
  813. X                 PANEL_VALUE_STORED_LENGTH, MAXSUBDIR,
  814. X                 PANEL_NOTIFY_PROC, newfolder,
  815. X                 XV_Y, xv_row(folder_panel, 0),
  816. X                 NULL);
  817. X    pitem = xv_create(folder_panel, PANEL_BUTTON,
  818. X                     PANEL_LABEL_STRING, "Apply",
  819. X                     PANEL_NOTIFY_PROC, newfolder,
  820. X                     XV_Y, xv_row(folder_panel, 1),
  821. X                     NULL);
  822. X    appbutton = pitem;
  823. X
  824. X    window_fit(folder_panel);
  825. X    window_fit(folder_frame);
  826. X
  827. X    xv_set(folder_frame, XV_SHOW, TRUE, NULL);
  828. X
  829. X    frame_get_rect(folder_frame, &rect);
  830. X    prect = (Rect *) xv_get(pitem, PANEL_ITEM_RECT);
  831. X    xv_set(pitem, XV_X, ((rect.r_width / 2) - (prect->r_width / 2)), NULL);
  832. X
  833. X
  834. X    (void) xv_set(folder_mitem, MENU_INACTIVE, TRUE, NULL);
  835. X    }
  836. X
  837. X/*
  838. X    Called when the user wants to create a new folder.
  839. X    Note: item and event args are not used.
  840. X*/
  841. Xnewfolder(item, event)
  842. X    Panel_item item;
  843. X    Event *event;
  844. X    {
  845. X    char new_dir[MAXBUFLEN];
  846. X
  847. X    strcpy(new_dir, (char *) xv_get(folder_item, PANEL_VALUE));
  848. X
  849. X    if(xv_get(folder_frame, FRAME_CMD_PUSHPIN_IN) == FALSE)
  850. X        {
  851. X        xv_destroy_safe(folder_frame);
  852. X        (void) xv_set(folder_mitem, MENU_INACTIVE, FALSE, NULL);
  853. X        }
  854. X
  855. X    xv_set(folder_frame, FRAME_BUSY, TRUE, NULL);
  856. X
  857. X    w_newfolder(new_dir, ERRONDISPLAY); /* Does all the real work */
  858. X
  859. X    xv_set(folder_frame, FRAME_BUSY, FALSE, NULL);
  860. X    }
  861. X
  862. X/*
  863. X    Called when the user dismisses the change folder window without applying
  864. X    a change.
  865. X*/
  866. Xfolderdone()
  867. X    {
  868. X    xv_destroy_safe(folder_frame);
  869. X    (void) xv_set(folder_mitem, MENU_INACTIVE, FALSE, NULL);
  870. X    }
  871. X
  872. X/*
  873. X    Center the button here even though we don't allow a resize because of
  874. X    the intermittent failure of frame_get_rect() immediately after frame
  875. X    creation.
  876. X*/
  877. Xcf_resize_proc(frame, event, arg)
  878. X    Frame frame;
  879. X    Event *event;
  880. X    Notify_arg arg;
  881. X    {
  882. X    Rect rect, *prect;
  883. X    if(event_id(event) != WIN_RESIZE) return;
  884. X    frame_get_rect(frame, &rect);
  885. X    rect.r_height -= (topmargin + bottommargin); /* correct for wm title bar */
  886. X
  887. X    prect = (Rect *) xv_get(appbutton, PANEL_ITEM_RECT);
  888. X    xv_set(appbutton, XV_X, rect.r_width / 2 - prect->r_width / 2, NULL);
  889. X    }
  890. SHAR_EOF
  891. chmod 0644 pan3.0/folder.c ||
  892. echo 'restore of pan3.0/folder.c failed'
  893. Wc_c="`wc -c < 'pan3.0/folder.c'`"
  894. test 4846 -eq "$Wc_c" ||
  895.     echo 'pan3.0/folder.c: original size 4846, current size' "$Wc_c"
  896. fi
  897. # ============= pan3.0/patchlevel.h ==============
  898. if test -f 'pan3.0/patchlevel.h' -a X"$1" != X"-c"; then
  899.     echo 'x - skipping pan3.0/patchlevel.h (File already exists)'
  900. else
  901. echo 'x - extracting pan3.0/patchlevel.h (Text)'
  902. sed 's/^X//' << 'SHAR_EOF' > 'pan3.0/patchlevel.h' &&
  903. X#define PAN_VERSION "Post A Note V3.0"
  904. SHAR_EOF
  905. chmod 0644 pan3.0/patchlevel.h ||
  906. echo 'restore of pan3.0/patchlevel.h failed'
  907. Wc_c="`wc -c < 'pan3.0/patchlevel.h'`"
  908. test 39 -eq "$Wc_c" ||
  909.     echo 'pan3.0/patchlevel.h: original size 39, current size' "$Wc_c"
  910. fi
  911. # ============= pan3.0/noteaction.c ==============
  912. if test -f 'pan3.0/noteaction.c' -a X"$1" != X"-c"; then
  913.     echo 'x - skipping pan3.0/noteaction.c (File already exists)'
  914. else
  915. echo 'x - extracting pan3.0/noteaction.c (Text)'
  916. sed 's/^X//' << 'SHAR_EOF' > 'pan3.0/noteaction.c' &&
  917. X/*
  918. XPost A Note V3.0
  919. XCopyright (c) 1993, Jeffrey W. Bailey
  920. XAll rights reserved.
  921. X
  922. XPermission is granted to distribute this program in exact, complete
  923. Xsource form, which includes this copyright notice, as long as no fee
  924. Xother than media and distribution cost is charged.
  925. X
  926. XThis program may not be used in whole, or in part, in any other manner
  927. Xwithout prior written permission from the author.
  928. X
  929. XThis program may not be distributed in modified form without prior
  930. Xwritten permission from the author.  In other words, patches may be
  931. Xdistributed, but modified source may not be distributed.
  932. X
  933. XIf there are any questions, comments or suggestions, the author may be
  934. Xcontacted at:
  935. X
  936. X    jeff@rd1.interlan.com
  937. X
  938. X    or
  939. X
  940. X    Jeffrey Bailey
  941. X    Racal-Datacom, Inc.
  942. X    Mail Stop E-110
  943. X    1601 N. Harrison Parkway
  944. X    Sunrise, FL  33323-2899
  945. X*/
  946. X
  947. X#include "pan.h"
  948. X
  949. X#include <xview/font.h>
  950. X
  951. Xextern int errno;
  952. Xextern char *sys_errlist[];
  953. X
  954. X/*
  955. X    Routine called when the action button on a note is selected.
  956. X*/
  957. Xnoteaction(menu, mitem)
  958. X    Menu menu;
  959. X    Menu_item mitem;
  960. X    {
  961. X    Font font;
  962. X    Rect rect;
  963. X    int  cw, tw;
  964. X    struct Note *np;
  965. X    int  mod;
  966. X    char fname[MAXBUFLEN];
  967. X    char item[MAXBUFLEN];
  968. X
  969. X    np = (struct Note *) xv_get(menu, MENU_CLIENT_DATA);
  970. X    strcpy(item, (char *)xv_get(mitem, MENU_STRING));
  971. X    if(strcmp(item, "Print") == 0)
  972. X        {
  973. X        w_printnote(np, ERRONDISPLAY);
  974. X        }
  975. X    if(strcmp(item, widthtext) == 0)
  976. X        {
  977. X        font = xv_get(np->textsw, TEXTSW_FONT);
  978. X
  979. X        cw = xv_get(font, FONT_DEFAULT_CHAR_WIDTH);
  980. X
  981. X        tw = cw * setwidth;
  982. X
  983. X        frame_get_rect(np->frame, &rect);
  984. X        rect.r_width = tw + leftmargin + rightmargin + SCROLLWIDTH;
  985. X        frame_set_rect(np->frame, &rect);
  986. X        }
  987. X    if(strcmp(item, "Destroy") == 0)
  988. X        {
  989. X        if(confirmdestroy)
  990. X            {
  991. X            if(notice_prompt(np->frame, NULL,
  992. X                         NOTICE_MESSAGE_STRINGS, "Really destroy this note?", NULL,
  993. X                         NOTICE_BUTTON_YES, "Yes",
  994. X                         NOTICE_BUTTON_NO, "No",
  995. X                         NOTICE_NO_BEEPING, noticenobeep,
  996. X                         NULL) == NOTICE_NO)
  997. X                {
  998. X                return;
  999. X                }
  1000. X            }
  1001. X        mod = xv_get(np->textsw, TEXTSW_MODIFIED);
  1002. X        if(mod)
  1003. X            {
  1004. X            textsw_reset(np->textsw, 0, 0);
  1005. X            }
  1006. X        makename(fname, np);
  1007. X        (void) unlink(fname);
  1008. X        strcat(fname, "%"); /* Attempt to remove the textsw files */
  1009. X        (void) unlink(fname);
  1010. X        makeinfoname(fname, np);
  1011. X        (void) unlink(fname);
  1012. X        put_win(np);
  1013. X        LLM_delete(&np->sp->note_rt, (char *)np);
  1014. X        refresh_popups();
  1015. X        }
  1016. X    }
  1017. SHAR_EOF
  1018. chmod 0644 pan3.0/noteaction.c ||
  1019. echo 'restore of pan3.0/noteaction.c failed'
  1020. Wc_c="`wc -c < 'pan3.0/noteaction.c'`"
  1021. test 2705 -eq "$Wc_c" ||
  1022.     echo 'pan3.0/noteaction.c: original size 2705, current size' "$Wc_c"
  1023. fi
  1024. # ============= pan3.0/Makefile.std ==============
  1025. if test -f 'pan3.0/Makefile.std' -a X"$1" != X"-c"; then
  1026.     echo 'x - skipping pan3.0/Makefile.std (File already exists)'
  1027. else
  1028. echo 'x - extracting pan3.0/Makefile.std (Text)'
  1029. sed 's/^X//' << 'SHAR_EOF' > 'pan3.0/Makefile.std' &&
  1030. XCC=cc
  1031. XINCLUDES=-I$(OPENWINHOME)/include
  1032. X#
  1033. X# Use -DPAN_DND if you have XView 3.0 or greater (includes drag and drop)
  1034. X# Use -DHAS_STDLIB if you have stdlib.h (declares malloc() & getenv())
  1035. X# Use -DSUNOS4 for XView 3.2 on SunOS 4.x (as opposed to Solaris 2.x)
  1036. X# Use -DBSD if compiling on BSD UNIX
  1037. X#
  1038. XCFLAGS=$(INCLUDES) -g -DPAN_DND -DHAS_STDLIB
  1039. X
  1040. XSRCS=pan.c control.c event.c folder.c hidexp.c llm.c menu.c misc.c move.c \
  1041. X    note.c parser.c rmfolder.c noteaction.c search.c update.c win.c work.c\
  1042. X    dnd.c
  1043. XOBJS=pan.o control.o event.o folder.o hidexp.o llm.o menu.o misc.o move.o \
  1044. X    note.o parser.o rmfolder.o noteaction.o search.o update.o win.o work.o\
  1045. X    dnd.o
  1046. XLIBS=-L$(OPENWINHOME)/lib -lxview -lolgx -lX11
  1047. XTARGET=pan
  1048. X
  1049. X$(TARGET) : $(OBJS)
  1050. X    $(CC) -o $(TARGET) $(OBJS) $(LIBS)
  1051. X
  1052. Xpan.o : pan.c pan.icon panmain.icon
  1053. X
  1054. X$(OBJS) : pan.h
  1055. X
  1056. Xclean:
  1057. X    rm -f core lint.out tags $(TARGET) $(OBJS)
  1058. X
  1059. Xtags : $(SRCS) pan.h
  1060. X    ctags -t *.[ch]
  1061. X
  1062. Xlint:
  1063. X    lint $(INCLUDES) $(SRCS) > lint.out
  1064. SHAR_EOF
  1065. chmod 0644 pan3.0/Makefile.std ||
  1066. echo 'restore of pan3.0/Makefile.std failed'
  1067. Wc_c="`wc -c < 'pan3.0/Makefile.std'`"
  1068. test 958 -eq "$Wc_c" ||
  1069.     echo 'pan3.0/Makefile.std: original size 958, current size' "$Wc_c"
  1070. fi
  1071. # ============= pan3.0/pancmd ==============
  1072. if test -f 'pan3.0/pancmd' -a X"$1" != X"-c"; then
  1073.     echo 'x - skipping pan3.0/pancmd (File already exists)'
  1074. else
  1075. echo 'x - extracting pan3.0/pancmd (Text)'
  1076. sed 's/^X//' << 'SHAR_EOF' > 'pan3.0/pancmd' &&
  1077. X#!/bin/sh
  1078. X
  1079. XMYNAME=`basename $0`
  1080. XUSAGE="Usage:
  1081. X
  1082. X$MYNAME [-user <username>] [-dir <pan directory>] [-now] <pan command> <arguments> ...
  1083. X
  1084. X    Command Language Syntax:
  1085. X
  1086. X    expose    title <title RE> [windowmax <max # to expose>]
  1087. X    hide      title <title RE>
  1088. X    move      source <folder> title <title RE> destination <folder>
  1089. X    newfolder folder <name>
  1090. X    newnote   [folder <folder>] [title <title>] [size <width> <height>]
  1091. X          [location <x> <y>] [hidden|visible|veiled] [file <name>]
  1092. X    print     folder <folder> title <title RE>
  1093. X    quit
  1094. X    veil      title <title RE>
  1095. X
  1096. X"
  1097. X
  1098. Xerrexit() {
  1099. X    echo $MYNAME:  "$@"
  1100. X    exit 1
  1101. X}
  1102. X
  1103. X#
  1104. X# Lock the control file
  1105. X#
  1106. Xlockctrl() {
  1107. X    retries=0
  1108. X    while [ -f $PANCTRLLOCK -a $retries -lt 10 ]
  1109. X        do
  1110. X        sleep 1
  1111. X        retries=`expr $retries + 1`
  1112. X        done
  1113. X    if [ -f $PANCTRLLOCK ]; then
  1114. X        errexit "Could not lock $PANCTRL"
  1115. X    fi
  1116. X    touch $PANCTRLLOCK 
  1117. X    if [ $? -ne 0 ]; then
  1118. X        errexit "Could not lock $PANCTRL"
  1119. X    fi
  1120. X}
  1121. X
  1122. X#
  1123. X# Unlock the control file
  1124. X#
  1125. Xunlockctrl() {
  1126. X    rm $PANCTRLLOCK
  1127. X    if [ $? -ne 0 ]; then
  1128. X        errexit "Problem unlocking $PANCTRL"
  1129. X    fi
  1130. X}
  1131. X
  1132. X#
  1133. X# Send pan a signal to check the control file immediately
  1134. X#
  1135. Xstartpan() {
  1136. X    if [ -s $PANPID ]; then
  1137. X        kill -USR1 `cat $PANPID`
  1138. X    fi
  1139. X}
  1140. X
  1141. X#
  1142. X# Start of script
  1143. X#
  1144. X
  1145. Xif [ -z "$1" ]; then
  1146. X    echo "$MYNAME:  Missing arguments"
  1147. X    echo "$USAGE"
  1148. X    exit 1
  1149. Xfi
  1150. X
  1151. Xuser=$USER
  1152. Xdir=""
  1153. Xnow=0
  1154. X
  1155. Xwhile expr match "$1" "-.*" >/dev/null
  1156. X    do
  1157. X    if [ "$1" = "-user" ]; then
  1158. X        shift
  1159. X        if [ -z "$1" ]; then
  1160. X            echo "Missing name for -user option."
  1161. X            errexit "$USAGE"
  1162. X        fi
  1163. X        user="$1"
  1164. X    fi
  1165. X
  1166. X    if [ -z "$user" ]; then
  1167. X        errexit "Environment variable USER not set."
  1168. X    fi
  1169. X
  1170. X    if [ "$1" = "-dir" ]; then
  1171. X        shift
  1172. X        if [ -z "$1" ]; then
  1173. X            echo "Missing directory for -dir option."
  1174. X            errexit "$USAGE"
  1175. X        fi
  1176. X        dir="$1"
  1177. X    fi
  1178. X    if [ "$1" = "-now" ]; then
  1179. X        now=1
  1180. X    fi
  1181. X    shift
  1182. Xdone
  1183. X
  1184. X#
  1185. X# Get user's home directory if -dir not used.
  1186. X#
  1187. Xif [ -z "$dir" ]; then
  1188. X    ypmatch $user passwd > /dev/null 2>&1
  1189. X    if [ $? -ne 0 ]; then
  1190. X        dir=`awk -F: '$1 == "'$user'" { print $6 }' < /etc/passwd`
  1191. X    else
  1192. X        dir=`ypmatch $user passwd | awk -F: '$1 == "'$user'" { print $6 }'`
  1193. X    fi
  1194. X    dir="$dir/.pan"
  1195. Xfi
  1196. X
  1197. Xif [ ! -d $dir ]; then
  1198. X    errexit "$dir:  No such file or directory."
  1199. Xfi
  1200. X
  1201. XPANCTRL=$dir/PanCtrl
  1202. XPANCTRLLOCK=$PANCTRL.lock
  1203. XPANPID=$dir/PID
  1204. X
  1205. Xif [ -z "$1" ]; then
  1206. X    if [ $now -eq 1 ]; then
  1207. X        startpan
  1208. X        exit 0
  1209. X    else
  1210. X        echo "$MYNAME:  Missing arguments"
  1211. X        echo "$USAGE"
  1212. X        exit 1
  1213. X    fi
  1214. Xfi
  1215. X
  1216. Xlockctrl
  1217. X
  1218. Xset -- "$@"
  1219. Xwhile [ -n "$1" ]
  1220. X    do
  1221. X    echo $1
  1222. X    shift
  1223. X    done | awk '
  1224. X    {
  1225. X    if(index($0, " ") || index($0, "    "))
  1226. X        {
  1227. X        if(index($0, "\""))
  1228. X            printf "'\'%s\'' ", $0
  1229. X        else
  1230. X            printf "\"%s\" ", $0;
  1231. X        }
  1232. X    else
  1233. X        {
  1234. X        printf "%s ", $0
  1235. X        }
  1236. X    }
  1237. XEND {
  1238. X    printf "\n"
  1239. X    }' >> $PANCTRL
  1240. X
  1241. Xif [ $? -ne 0 ]; then
  1242. X    unlockctrl
  1243. X    errexit "Problem writing $PANCTRL"
  1244. Xfi
  1245. X
  1246. Xunlockctrl
  1247. X
  1248. Xif [ $now -eq 1 ]; then
  1249. X    startpan
  1250. Xfi
  1251. X
  1252. Xexit 0
  1253. SHAR_EOF
  1254. chmod 0755 pan3.0/pancmd ||
  1255. echo 'restore of pan3.0/pancmd failed'
  1256. Wc_c="`wc -c < 'pan3.0/pancmd'`"
  1257. test 3137 -eq "$Wc_c" ||
  1258.     echo 'pan3.0/pancmd: original size 3137, current size' "$Wc_c"
  1259. fi
  1260. # ============= pan3.0/panlog ==============
  1261. if test -f 'pan3.0/panlog' -a X"$1" != X"-c"; then
  1262.     echo 'x - skipping pan3.0/panlog (File already exists)'
  1263. else
  1264. echo 'x - extracting pan3.0/panlog (Text)'
  1265. sed 's/^X//' << 'SHAR_EOF' > 'pan3.0/panlog' &&
  1266. X#!/bin/sh
  1267. X
  1268. XMYNAME=`basename $0`
  1269. XUSAGE="Usage:
  1270. X
  1271. X$MYNAME [-user <username>] [-dir <pan directory>] [-remove] [-quiet]
  1272. X
  1273. X    Displays the pan log from control file execution.
  1274. X
  1275. X"
  1276. X
  1277. Xerrexit() {
  1278. X    echo $MYNAME:  "$@"
  1279. X    exit 1
  1280. X}
  1281. X
  1282. X#
  1283. X# Start of script
  1284. X#
  1285. X
  1286. Xuser=$USER
  1287. Xdir=""
  1288. Xremove=0
  1289. Xquiet=0
  1290. X
  1291. Xwhile expr match "$1" "-.*" >/dev/null
  1292. X    do
  1293. X    if [ "$1" = "-user" ]; then
  1294. X        shift
  1295. X        if [ -z "$1" ]; then
  1296. X            echo "Missing name for -user option."
  1297. X            errexit "$USAGE"
  1298. X        fi
  1299. X        user="$1"
  1300. X    fi
  1301. X
  1302. X    if [ -z "$user" ]; then
  1303. X        errexit "Environment variable USER not set."
  1304. X    fi
  1305. X
  1306. X    if [ "$1" = "-dir" ]; then
  1307. X        shift
  1308. X        if [ -z "$1" ]; then
  1309. X            echo "Missing directory for -dir option."
  1310. X            errexit "$USAGE"
  1311. X        fi
  1312. X        dir="$1"
  1313. X    fi
  1314. X    if [ "$1" = "-remove" ]; then
  1315. X        remove=1
  1316. X    fi
  1317. X    if [ "$1" = "-quiet" ]; then
  1318. X        quiet=1
  1319. X    fi
  1320. X    shift
  1321. Xdone
  1322. X
  1323. X#
  1324. X# Get user's home directory if -dir not used.
  1325. X#
  1326. Xif [ -z "$dir" ]; then
  1327. X    ypmatch $user passwd > /dev/null 2>&1
  1328. X    if [ $? -ne 0 ]; then
  1329. X        dir=`awk -F: '$1 == "'$user'" { print $6 }' < /etc/passwd`
  1330. X    else
  1331. X        dir=`ypmatch $user passwd | awk -F: '$1 == "'$user'" { print $6 }'`
  1332. X    fi
  1333. X    dir="$dir/.pan"
  1334. Xfi
  1335. X
  1336. Xif [ ! -d $dir ]; then
  1337. X    errexit "$dir:  No such file or directory."
  1338. Xfi
  1339. X
  1340. XPANCTRL=$dir/PanCtrl
  1341. XPANCTRLLOG=$PANCTRL.log
  1342. XPANCTRLLOCK=$PANCTRL.lock
  1343. X
  1344. Xif [ $quiet -eq 0 ]; then
  1345. X    if [ ! -f $PANCTRLLOG ]; then
  1346. X        echo "No log file found"
  1347. X    else
  1348. X        cat $PANCTRLLOG
  1349. X    fi
  1350. Xfi
  1351. X
  1352. Xif [ $remove -ne 0 ]; then
  1353. X    if [ -f $PANCTRLLOCK ]; then
  1354. X        errexit "Can't remove $PANCTRLLOG - file is locked"
  1355. X    fi
  1356. X    rm $PANCTRLLOG > /dev/null 2>&1
  1357. X    if [ $? -ne 0 ]; then
  1358. X        errexit "Problem removing $PANCTRLLOG"
  1359. X    fi
  1360. Xfi
  1361. X
  1362. Xexit 0
  1363. SHAR_EOF
  1364. chmod 0755 pan3.0/panlog ||
  1365. echo 'restore of pan3.0/panlog failed'
  1366. Wc_c="`wc -c < 'pan3.0/panlog'`"
  1367. test 1791 -eq "$Wc_c" ||
  1368.     echo 'pan3.0/panlog: original size 1791, current size' "$Wc_c"
  1369. fi
  1370. # ============= pan3.0/Imakefile ==============
  1371. if test -f 'pan3.0/Imakefile' -a X"$1" != X"-c"; then
  1372.     echo 'x - skipping pan3.0/Imakefile (File already exists)'
  1373. else
  1374. echo 'x - extracting pan3.0/Imakefile (Text)'
  1375. sed 's/^X//' << 'SHAR_EOF' > 'pan3.0/Imakefile' &&
  1376. XEXTRA_INCLUDES  = -I$(OPENWINHOME)/include
  1377. X#
  1378. X# Use -DPAN_DND if you have XView 3.0 or greater (includes drag and drop)
  1379. X# Use -DHAS_STDLIB if you have stdlib.h (declares malloc() & getenv())
  1380. X# Use -DSUNOS4 for XView 3.2 on SunOS 4.x (as opposed to Solaris 2.x)
  1381. X# Use -DBSD if compiling on BSD UNIX
  1382. X#
  1383. XDEFINES         = -DPAN_DND -DHAS_STDLIB -DSUNOS4
  1384. XLOCAL_LIBRARIES = -lxview -lolgx $(XLIB)
  1385. XLDOPTIONS       = -L$(OPENWINHOME)/lib
  1386. X
  1387. XSRCS =  pan.c control.c event.c folder.c hidexp.c llm.c menu.c misc.c move.c \
  1388. X    note.c parser.c rmfolder.c noteaction.c search.c update.c win.c work.c\
  1389. X    dnd.c
  1390. XOBJS =  pan.o control.o event.o folder.o hidexp.o llm.o menu.o misc.o move.o \
  1391. X    note.o parser.o rmfolder.o noteaction.o search.o update.o win.o work.o\
  1392. X    dnd.o
  1393. X
  1394. XComplexProgramTarget(pan)
  1395. X
  1396. X$(OBJS) : pan.h
  1397. SHAR_EOF
  1398. chmod 0644 pan3.0/Imakefile ||
  1399. echo 'restore of pan3.0/Imakefile failed'
  1400. Wc_c="`wc -c < 'pan3.0/Imakefile'`"
  1401. test 792 -eq "$Wc_c" ||
  1402.     echo 'pan3.0/Imakefile: original size 792, current size' "$Wc_c"
  1403. fi
  1404. # ============= pan3.0/panmain.mask.icon ==============
  1405. if test -f 'pan3.0/panmain.mask.icon' -a X"$1" != X"-c"; then
  1406.     echo 'x - skipping pan3.0/panmain.mask.icon (File already exists)'
  1407. else
  1408. echo 'x - extracting pan3.0/panmain.mask.icon (Text)'
  1409. sed 's/^X//' << 'SHAR_EOF' > 'pan3.0/panmain.mask.icon' &&
  1410. X/* Format_version=1, Width=64, Height=64, Depth=1, Valid_bits_per_item=16
  1411. X */
  1412. X    0x0000,    0x0000,    0x0000,    0x0000,
  1413. X    0x0000,    0x0000,    0x0000,    0x0000,
  1414. X    0x0000,    0x0000,    0x0000,    0x0000,
  1415. X    0x0000,    0x0000,    0x0000,    0x0000,
  1416. X    0xFFFF,    0xFFFF,    0xFFFF,    0xFFFF,
  1417. X    0xFFFF,    0xFFFF,    0xFFFF,    0xFFFF,
  1418. X    0xFFFF,    0xFFFF,    0xFFFF,    0xFFFF,
  1419. X    0xFFFF,    0xFFFF,    0xFFFF,    0xFFFF,
  1420. X    0xFFFF,    0xFFFF,    0xFFFF,    0xFFFF,
  1421. X    0xFFFF,    0xFFFF,    0xFFFF,    0xFFFF,
  1422. X    0xFFFF,    0xFFFF,    0xFFFF,    0xFFFF,
  1423. X    0xFFFF,    0xFFFF,    0xFFFF,    0xFFFF,
  1424. X    0xFFFF,    0xFFFF,    0xFFFF,    0xFFFF,
  1425. X    0xFFFF,    0xFFFF,    0xFFFF,    0xFFFF,
  1426. X    0xFFFF,    0xFFFF,    0xFFFF,    0xFFFF,
  1427. X    0xFFFF,    0xFFFF,    0xFFFF,    0xFFFF,
  1428. X    0xFFFF,    0xFFFF,    0xFFFF,    0xFFFF,
  1429. X    0xFFFF,    0xFFFF,    0xFFFF,    0xFFFF,
  1430. X    0xFFFF,    0xFFFF,    0xFFFF,    0xFFFF,
  1431. X    0xFFFF,    0xFFFF,    0xFFFF,    0xFFFF,
  1432. X    0xFFFF,    0xFFFF,    0xFFFF,    0xFFFF,
  1433. X    0xFFFF,    0xFFFF,    0xFFFF,    0xFFFF,
  1434. X    0xFFFF,    0xFFFF,    0xFFFF,    0xFFFF,
  1435. X    0xFFFF,    0xFFFF,    0xFFFF,    0xFFFF,
  1436. X    0xFFFF,    0xFFFF,    0xFFFF,    0xFFFF,
  1437. X    0xFFFF,    0xFFFF,    0xFFFF,    0xFFFF,
  1438. X    0xFFFF,    0xFFFF,    0xFFFF,    0xFFFF,
  1439. X    0xFFFF,    0xFFFF,    0xFFFF,    0xFFFF,
  1440. X    0xFFFF,    0xFFFF,    0xFFFF,    0xFFFF,
  1441. X    0xFFFF,    0xFFFF,    0xFFFF,    0xFFFF,
  1442. X    0xFFFF,    0xFFFF,    0xFFFF,    0xFFFF,
  1443. X    0xFFFF,    0xFFFF,    0xFFFF,    0xFFFF,
  1444. X    0xFFFF,    0xFFFF,    0xFFFF,    0xFFFF,
  1445. X    0xFFFF,    0xFFFF,    0xFFFF,    0xFFFF,
  1446. X    0xFFFF,    0xFFFF,    0xFFFF,    0xFFFF,
  1447. X    0xFFFF,    0xFFFF,    0xFFFF,    0xFFFF,
  1448. X    0xFFFF,    0xFFFF,    0xFFFF,    0xFFFF,
  1449. X    0xFFFF,    0xFFFF,    0xFFFF,    0xFFFF,
  1450. X    0xFFFF,    0xFFFF,    0xFFFF,    0xFFFF,
  1451. X    0x0000,    0x0000,    0x0000,    0x0000,
  1452. X    0x0000,    0x0000,    0x0000,    0x0000,
  1453. X    0x0000,    0x0000,    0x0000,    0x0000,
  1454. X    0x0000,    0x0000,    0x0000,    0x0000,
  1455. X    0x0000,    0x0000,    0x0000,    0x0000,
  1456. X    0x0000,    0x0000,    0x0000,    0x0000,
  1457. X    0x0000,    0x0000,    0x0000,    0x0000,
  1458. X    0x0000,    0x0000,    0x0000,    0x0000,
  1459. X    0x0000,    0x0000,    0x0000,    0x0000,
  1460. X    0x0000,    0x0000,    0x0000,    0x0000,
  1461. X    0x0000,    0x0000,    0x0000,    0x0000,
  1462. X    0x0000,    0x0000,    0x0000,    0x0000,
  1463. X    0x0000,    0x0000,    0x0000,    0x0000,
  1464. X    0x0000,    0x0000,    0x0000,    0x0000,
  1465. X    0x0000,    0x0000,    0x0000,    0x0000,
  1466. X    0x0000,    0x0000,    0x0000,    0x0000,
  1467. X    0x0000,    0x0000,    0x0000,    0x0000,
  1468. X    0x0000,    0x0000,    0x0000,    0x0000,
  1469. X    0x0000,    0x0000,    0x0000,    0x0000,
  1470. X    0x0000,    0x0000,    0x0000,    0x0000,
  1471. X    0x0000,    0x0000,    0x0000,    0x0000,
  1472. X    0x0000,    0x0000,    0x0000,    0x0000,
  1473. X    0x0000,    0x0000,    0x0000,    0x0000,
  1474. X    0x0000,    0x0000,    0x0000,    0x0000,
  1475. X    0x0000,    0x0000,    0x0000,    0x0000,
  1476. SHAR_EOF
  1477. chmod 0644 pan3.0/panmain.mask.icon ||
  1478. echo 'restore of pan3.0/panmain.mask.icon failed'
  1479. Wc_c="`wc -c < 'pan3.0/panmain.mask.icon'`"
  1480. test 2190 -eq "$Wc_c" ||
  1481.     echo 'pan3.0/panmain.mask.icon: original size 2190, current size' "$Wc_c"
  1482. fi
  1483. # ============= pan3.0/pan.mask.icon ==============
  1484. if test -f 'pan3.0/pan.mask.icon' -a X"$1" != X"-c"; then
  1485.     echo 'x - skipping pan3.0/pan.mask.icon (File already exists)'
  1486. else
  1487. echo 'x - extracting pan3.0/pan.mask.icon (Text)'
  1488. sed 's/^X//' << 'SHAR_EOF' > 'pan3.0/pan.mask.icon' &&
  1489. X/* Format_version=1, Width=64, Height=64, Depth=1, Valid_bits_per_item=16
  1490. X */
  1491. X    0x0000,    0x0000,    0x0000,    0x0800,
  1492. X    0x0000,    0x0000,    0x0000,    0x1E00,
  1493. X    0x0000,    0x0000,    0x0000,    0x1F00,
  1494. X    0x0000,    0x0000,    0x0000,    0x3E00,
  1495. X    0x0000,    0x0000,    0x0000,    0x7E00,
  1496. X    0x0000,    0x0000,    0x0000,    0x7C00,
  1497. X    0x07FF,    0xFFFF,    0xFFFF,    0xFFE0,
  1498. X    0x07FF,    0xFFFF,    0xFFFF,    0xFFE0,
  1499. X    0x07FF,    0xFFFF,    0xFFFF,    0xFFE0,
  1500. X    0x07FF,    0xFFFF,    0xFFFF,    0xFFE0,
  1501. X    0x07FF,    0xFFFF,    0xFFFF,    0xFFE0,
  1502. X    0x07FF,    0xFFFF,    0xFFFF,    0xFFE0,
  1503. X    0x07FF,    0xFFFF,    0xFFFF,    0xFFE0,
  1504. X    0x07FF,    0xFFFF,    0xFFFF,    0xFFE0,
  1505. X    0x07FF,    0xFFFF,    0xFFFF,    0xFFE0,
  1506. X    0x07FF,    0xFFFF,    0xFFFF,    0xFFE0,
  1507. X    0x07FF,    0xFFFF,    0xFFFF,    0xFFE0,
  1508. X    0x07FF,    0xFFFF,    0xFFFF,    0xFFE0,
  1509. X    0x07FF,    0xFFFF,    0xFFFF,    0xFFE0,
  1510. X    0x07FF,    0xFFFF,    0xFFFF,    0xFFE0,
  1511. X    0x07FF,    0xFFFF,    0xFFFF,    0xFFE0,
  1512. X    0x07FF,    0xFFFF,    0xFFFF,    0xFFE0,
  1513. X    0x07FF,    0xFFFF,    0xFFFF,    0xFFE0,
  1514. X    0x07FF,    0xFFFF,    0xFFFF,    0xFFE0,
  1515. X    0x07FF,    0xFFFF,    0xFFFF,    0xFFE0,
  1516. X    0x07FF,    0xFFFF,    0xFFFF,    0xFFE0,
  1517. X    0x07FF,    0xFFFF,    0xFFFF,    0xFFE0,
  1518. X    0x07FF,    0xFFFF,    0xFFFF,    0xFFE0,
  1519. X    0x07FF,    0xFFFF,    0xFFFF,    0xFFE0,
  1520. X    0x07FF,    0xFFFF,    0xFFFF,    0xFFE0,
  1521. X    0x07FF,    0xFFFF,    0xFFFF,    0xFFE0,
  1522. X    0x07FF,    0xFFFF,    0xFFFF,    0xFFE0,
  1523. X    0x07FF,    0xFFFF,    0xFFFF,    0xFFE0,
  1524. X    0x07FF,    0xFFFF,    0xFFFF,    0xFFE0,
  1525. X    0x07FF,    0xFFFF,    0xFFFF,    0xFFE0,
  1526. X    0x07FF,    0xFFFF,    0xFFFF,    0xFFE0,
  1527. X    0x07FF,    0xFFFF,    0xFFFF,    0xFFE0,
  1528. X    0x07FF,    0xFFFF,    0xFFFF,    0xFFE0,
  1529. X    0x07FF,    0xFFFF,    0xFFFF,    0xFFE0,
  1530. X    0x07FF,    0xFFFF,    0xFFFF,    0xFFE0,
  1531. X    0x07FF,    0xFFFF,    0xFFFF,    0xFFE0,
  1532. X    0x07FF,    0xFFFF,    0xFFFF,    0xFFE0,
  1533. X    0x07FF,    0xFFFF,    0xFFFF,    0xFFE0,
  1534. X    0x07FF,    0xFFFF,    0xFFFF,    0xFFE0,
  1535. X    0x07FF,    0xFFFF,    0xFFFF,    0xFFE0,
  1536. X    0x07FF,    0xFFFF,    0xFFFF,    0xFFE0,
  1537. X    0x07FF,    0xFFFF,    0xFFFF,    0xFFE0,
  1538. X    0x0000,    0x0000,    0x0000,    0x0000,
  1539. X    0x0000,    0x0000,    0x0000,    0x0000,
  1540. X    0x0000,    0x0000,    0x0000,    0x0000,
  1541. X    0x0000,    0x0000,    0x0000,    0x0000,
  1542. X    0x0000,    0x0000,    0x0000,    0x0000,
  1543. X    0x0000,    0x0000,    0x0000,    0x0000,
  1544. X    0x0000,    0x0000,    0x0000,    0x0000,
  1545. X    0x0000,    0x0000,    0x0000,    0x0000,
  1546. X    0x0000,    0x0000,    0x0000,    0x0000,
  1547. X    0x0000,    0x0000,    0x0000,    0x0000,
  1548. X    0x0000,    0x0000,    0x0000,    0x0000,
  1549. X    0x0000,    0x0000,    0x0000,    0x0000,
  1550. X    0x0000,    0x0000,    0x0000,    0x0000,
  1551. X    0x0000,    0x0000,    0x0000,    0x0000,
  1552. X    0x0000,    0x0000,    0x0000,    0x0000,
  1553. X    0x0000,    0x0000,    0x0000,    0x0000,
  1554. X    0x0000,    0x0000,    0x0000,    0x0000,
  1555. SHAR_EOF
  1556. chmod 0644 pan3.0/pan.mask.icon ||
  1557. echo 'restore of pan3.0/pan.mask.icon failed'
  1558. Wc_c="`wc -c < 'pan3.0/pan.mask.icon'`"
  1559. test 2190 -eq "$Wc_c" ||
  1560.     echo 'pan3.0/pan.mask.icon: original size 2190, current size' "$Wc_c"
  1561. fi
  1562. exit 0
  1563.  
  1564. --
  1565. Jeffrey Bailey
  1566. Racal-Datacom, Inc.
  1567. Mail Stop E-110
  1568. 1601 N. Harrison Parkway                  INET : jeff@rd1.interlan.com
  1569. Sunrise, FL 33323-2899                    UUCP : ...uflorida!novavax!rd1!jeff
  1570.  
  1571. exit 0 # Just in case...
  1572. -- 
  1573.   // chris@Sterling.COM           | Send comp.sources.x submissions to:
  1574. \X/  Amiga - The only way to fly! |    sources-x@sterling.com
  1575.  "It's intuitively obvious to the |
  1576.   most casual observer..."        | GCS d+/-- p+ c++ l+ m+ s++/+ g+ w+ t+ r+ x+
  1577.