home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / misc / volume24 / zsh2.1 / part15 < prev    next >
Text File  |  1991-10-26  |  49KB  |  2,524 lines

  1. Newsgroups: comp.sources.misc
  2. From: pfalstad@phoenix.Princeton.EDU (Paul Falstad)
  3. Subject:  v24i015:  zsh2.1 - The Z shell, Part15/19
  4. Message-ID: <1991Oct26.020320.20362@sparky.imd.sterling.com>
  5. X-Md4-Signature: 728e5826b7740c5a4a3343baafc10771
  6. Date: Sat, 26 Oct 1991 02:03:20 GMT
  7. Approved: kent@sparky.imd.sterling.com
  8.  
  9. Submitted-by: pfalstad@phoenix.Princeton.EDU (Paul Falstad)
  10. Posting-number: Volume 24, Issue 15
  11. Archive-name: zsh2.1/part15
  12. Environment: BSD
  13. Supersedes: zsh2.00: Volume 18, Issue 84-98
  14.  
  15. #!/bin/sh
  16. # this is zshar.15 (part 15 of zsh2.1.0)
  17. # do not concatenate these parts, unpack them in order with /bin/sh
  18. # file zsh2.1/src/parse.c continued
  19. #
  20. if test ! -r _shar_seq_.tmp; then
  21.     echo 'Please unpack part 1 first!'
  22.     exit 1
  23. fi
  24. (read Scheck
  25.  if test "$Scheck" != 15; then
  26.     echo Please unpack part "$Scheck" next!
  27.     exit 1
  28.  else
  29.     exit 0
  30.  fi
  31. ) < _shar_seq_.tmp || exit 1
  32. if test ! -f _shar_wnt_.tmp; then
  33.     echo 'x - still skipping zsh2.1/src/parse.c'
  34. else
  35. echo 'x - continuing file zsh2.1/src/parse.c'
  36. sed 's/^X//' << 'SHAR_EOF' >> 'zsh2.1/src/parse.c' &&
  37. X            strcpy(str2,str);
  38. X            str2[sl] = Bar;
  39. X            strcpy(str2+sl+1,tokstr);
  40. X            str = str2;
  41. X            yylex();
  42. X        }
  43. X        if (tok != OUTPAR) YYERRORV;
  44. X        incasepat = 0;
  45. X        incmdpos = 1;
  46. X        yylex();
  47. X        cc->pat = str;
  48. X        cc->list = par_list();
  49. X        ccp = &cc->next;
  50. X        if ((tok == ESAC && !brflag) || (tok == OUTBRACE && brflag)) {
  51. X            yylex();
  52. X            break;
  53. X        }
  54. X        if (tok != DSEMI) YYERRORV;
  55. X        incasepat = 1;
  56. X        incmdpos = 0;
  57. X        yylex();
  58. X    }
  59. X    *ccp = NULL;
  60. X}
  61. X
  62. X/*
  63. X * if    : { ( IF | ELIF | ELSE IF ) { SEPER } ( INPAR list OUTPAR | list )
  64. X            { SEPER } ( THEN list | INBRACE list OUTBRACE | list1 ) }
  65. X            [ FI | ELSE list FI | ELSE { SEPER } INBRACE list OUTBRACE ]
  66. X            (you get the idea...?)
  67. X */
  68. Xvoid par_if(c) /**/
  69. XCmd c;
  70. X{
  71. Xstruct ifcmd *i,**ip;
  72. Xint xtok;
  73. X
  74. X    c->type = CIF;
  75. X    ip = &c->u.ifcmd;
  76. X    for (;;) {
  77. X        xtok = tok;
  78. X        yylex();
  79. X        if (xtok == ELSE && tok == IF) {
  80. X            yylex();
  81. X            xtok = ELIF;
  82. X        }
  83. X        if (xtok == FI)
  84. X            break;
  85. X        while (tok == SEPER) yylex();
  86. X        if (xtok == ELSE)
  87. X            break;
  88. X        if (!(xtok == IF || xtok == ELIF)) YYERRORV;
  89. X        *ip = i = make_ifcmd();
  90. X        ip = &i->next;
  91. X        if (tok == INPAR) {
  92. X            yylex();
  93. X            i->ifl = par_list();
  94. X            if (tok != OUTPAR) YYERRORV;
  95. X            incmdpos = 1;
  96. X            yylex();
  97. X        } else {
  98. X            i->ifl = par_list();
  99. X            incmdpos = 1;
  100. X        }
  101. X        while (tok == SEPER) yylex();
  102. X        xtok = FI;
  103. X        if (tok == THEN) {
  104. X            yylex();
  105. X            i->thenl = par_list();
  106. X            incmdpos = 1;
  107. X        } else if (tok == INBRACE) {
  108. X            yylex();
  109. X            i->thenl = par_list();
  110. X            if (tok != OUTBRACE) YYERRORV;
  111. X            yylex();
  112. X            incmdpos = 1;
  113. X            if (tok == SEPER) break;
  114. X        } else if (isset(NOSHORTLOOPS)) {
  115. X            YYERRORV;
  116. X        } else {
  117. X            i->thenl = par_list1();
  118. X            incmdpos = 1;
  119. X            break;
  120. X        }
  121. X    }
  122. X    if (xtok == ELSE) {
  123. X        *ip = i = make_ifcmd();
  124. X        if (tok == INBRACE) {
  125. X            yylex();
  126. X            i->thenl = par_list();
  127. X            if (tok != OUTBRACE) YYERRORV;
  128. X            yylex();
  129. X        } else {
  130. X            i->thenl = par_list();
  131. X            if (tok != FI) YYERRORV;
  132. X            yylex();
  133. X        }
  134. X    }
  135. X}
  136. X
  137. X/*
  138. X * while    : ( WHILE | UNTIL ) ( INPAR list OUTPAR | list ) { SEPER }
  139. X                ( DO list DONE | INBRACE list OUTBRACE | list ZEND )
  140. X */
  141. Xvoid par_while(c) /**/
  142. XCmd c;
  143. X{
  144. Xstruct whilecmd *w;
  145. X
  146. X    c->type = CWHILE;
  147. X    w = c->u.whilecmd = make_whilecmd();
  148. X    w->cond = (tok == UNTIL);
  149. X    yylex();
  150. X    if (tok == INPAR) {
  151. X        yylex();
  152. X        w->cont = par_list();
  153. X        if (tok != OUTPAR) YYERRORV;
  154. X        yylex();
  155. X    } else {
  156. X        w->cont = par_list();
  157. X    }
  158. X    incmdpos = 1;
  159. X    while (tok == SEPER) yylex();
  160. X    if (tok == DO) {
  161. X        yylex();
  162. X        w->loop = par_list();
  163. X        if (tok != DONE) YYERRORV;
  164. X        yylex();
  165. X    } else if (tok == INBRACE) {
  166. X        yylex();
  167. X        w->loop = par_list();
  168. X        if (tok != OUTBRACE) YYERRORV;
  169. X        yylex();
  170. X    } else if (isset(CSHJUNKIELOOPS)) {
  171. X        w->loop = par_list();
  172. X        if (tok != ZEND) YYERRORV;
  173. X        yylex();
  174. X    } else
  175. X        YYERRORV;
  176. X}
  177. X
  178. X/*
  179. X * repeat    : REPEAT STRING { SEPER } ( DO list DONE | list1 )
  180. X */
  181. Xvoid par_repeat(c) /**/
  182. XCmd c;
  183. X{
  184. X    c->type = CREPEAT;
  185. X    incmdpos = 0;
  186. X    yylex();
  187. X    if (tok != STRING) YYERRORV;
  188. X    addnode(c->args,tokstr);
  189. X    incmdpos = 1;
  190. X    yylex();
  191. X    while (tok == SEPER) yylex();
  192. X    if (tok == DO) {
  193. X        yylex();
  194. X        c->u.list = par_list();
  195. X        if (tok != DONE) YYERRORV;
  196. X        yylex();
  197. X    } else {
  198. X        c->u.list = par_list1();
  199. X    }
  200. X}
  201. X
  202. X/*
  203. X * subsh    : ( INPAR | INBRACE ) list ( OUTPAR | OUTBRACE )
  204. X */
  205. Xvoid par_subsh(c) /**/
  206. XCmd c;
  207. X{
  208. X    c->type = (tok == INPAR) ? SUBSH : CURSH;
  209. X    yylex();
  210. X    c->u.list = par_list();
  211. X    if (tok != ((c->type == SUBSH) ? OUTPAR : OUTBRACE)) YYERRORV;
  212. X    yylex();
  213. X}
  214. X
  215. X/*
  216. X * funcdef    : FUNCTION wordlist [ INOUTPAR ] { SEPER }
  217. X *                    ( list1 | INBRACE list OUTBRACE )
  218. X */
  219. Xvoid par_funcdef(c) /**/
  220. XCmd c;
  221. X{
  222. X    yylex();
  223. X    c->type = FUNCDEF;
  224. X    c->args = par_wordlist();
  225. X    if (tok == INOUTPAR) yylex();
  226. X    while (tok == SEPER) yylex();
  227. X    if (tok == INBRACE) {
  228. X        yylex();
  229. X        c->u.list = par_list();
  230. X        if (tok != OUTBRACE) YYERRORV;
  231. X        yylex();
  232. X    } else if (isset(NOSHORTLOOPS)) {
  233. X        YYERRORV;
  234. X    } else
  235. X        c->u.list = par_list1();
  236. X}
  237. X
  238. X/*
  239. X * time    : TIME sublist2
  240. X */
  241. Xvoid par_time(c) /**/
  242. XCmd c;
  243. X{
  244. X    yylex();
  245. X    c->type = ZCTIME;
  246. X    c->u.pline = par_sublist2();
  247. X}
  248. X
  249. X/*
  250. X * dinbrack    : DINBRACK cond DOUTBRACK
  251. X */
  252. Xvoid par_dinbrack(c) /**/
  253. XCmd c;
  254. X{
  255. X    c->type = COND;
  256. X    incond = 1;
  257. X    incmdpos = 0;
  258. X    yylex();
  259. X    c->u.cond = par_cond();
  260. X    if (tok != DOUTBRACK) YYERRORV;
  261. X    incond = 0;
  262. X    yylex();
  263. X}
  264. X
  265. X/*
  266. X * simple    : { COMMAND | EXEC | NOGLOB | NOCORRECT | DASH }
  267. X                    { STRING | ENVSTRING | ENVARRAY wordlist OUTPAR | redir }
  268. X                    [ INOUTPAR { SEPER } ( list1 | INBRACE list OUTBRACE ) ]
  269. X */
  270. XCmd par_simple(c) /**/
  271. XCmd c;
  272. X{
  273. Xint isnull = 1;
  274. X
  275. X    c->type = SIMPLE;
  276. X    for (;;) {
  277. X        if (tok == COMMAND) c->flags |= CFLAG_COMMAND;
  278. X        else if (tok == EXEC) c->flags |= CFLAG_EXEC;
  279. X        else if (tok == NOGLOB) c->flags |= CFLAG_NOGLOB;
  280. X        else if (tok == NOCORRECT) nocorrect = 1;
  281. X        else if (tok == DASH) c->flags = CFLAG_DASH;
  282. X        else break;
  283. X        yylex();
  284. X    }
  285. X    if (tok == AMPER) YYERROR;
  286. X    for (;;) {
  287. X        if (tok == STRING) {
  288. X            incmdpos = 0;
  289. X            addnode(c->args,tokstr);
  290. X            yylex();
  291. X        } else if (tok == ENVSTRING) {
  292. X            struct varasg *v = make_varnode();
  293. X            v->type = PMFLAG_s;
  294. X            equalsplit(v->name = tokstr,&v->str);
  295. X            addnode(c->vars,v);
  296. X            yylex();
  297. X        } else if (tok == ENVARRAY) {
  298. X            struct varasg *v = make_varnode();
  299. X            int oldcmdpos = incmdpos;
  300. X            v->type = PMFLAG_A;
  301. X            incmdpos = 0;
  302. X            v->name = tokstr;
  303. X            yylex();
  304. X            v->arr = par_nl_wordlist();
  305. X            if (tok != OUTPAR) YYERROR;
  306. X            incmdpos = oldcmdpos;
  307. X            yylex();
  308. X            addnode(c->vars,v);
  309. X        } else if (IS_REDIROP(tok)) {
  310. X            par_redir(c->redir);
  311. X        } else if (tok == INOUTPAR) {
  312. X            incmdpos = 1;
  313. X            yylex();
  314. X            while (tok == SEPER) yylex();
  315. X            if (tok == INBRACE) {
  316. X                yylex();
  317. X                c->u.list = par_list();
  318. X                if (tok != OUTBRACE) YYERROR;
  319. X                yylex();
  320. X            } else if (isset(NOSHORTLOOPS)) {
  321. X                YYERROR;
  322. X            } else
  323. X                c->u.list = par_list1();
  324. X            c->type = FUNCDEF;
  325. X        } else break;
  326. X        isnull = 0;
  327. X    }
  328. X    if (isnull && !full(c->redir)) return NULL;
  329. X    if (full(c->args)) {
  330. X        if (underscore)
  331. X            free(underscore);
  332. X        underscore = ztrdup(getdata(lastnode(c->args)));
  333. X        untokenize(underscore);
  334. X    }
  335. X    incmdpos = 1;
  336. X    return c;
  337. X}
  338. X
  339. X/*
  340. X * cond    : cond_1 { SEPER } [ DBAR { SEPER } cond ]
  341. X */
  342. XCond par_cond() /**/
  343. X{
  344. XCond c,c2;
  345. X
  346. X    c = par_cond_1();
  347. X    while (tok == SEPER) yylex();
  348. X    if (tok == DBAR) {
  349. X        yylex();
  350. X        while (tok == SEPER) yylex();
  351. X        c2 = make_cond();
  352. X        c2->left = c;
  353. X        c2->right = par_cond();
  354. X        c2->type = COND_OR;
  355. X        return c2;
  356. X    }
  357. X    return c;
  358. X}
  359. X
  360. X/*
  361. X * cond_1 : cond_2 { SEPER } [ DAMPER { SEPER } cond_1 ]
  362. X */
  363. XCond par_cond_1() /**/
  364. X{
  365. XCond c,c2;
  366. X
  367. X    c = par_cond_2();
  368. X    while (tok == SEPER) yylex();
  369. X    if (tok == DAMPER) {
  370. X        yylex();
  371. X        while (tok == SEPER) yylex();
  372. X        c2 = make_cond();
  373. X        c2->left = c;
  374. X        c2->right = par_cond_1();
  375. X        c2->type = COND_AND;
  376. X        return c2;
  377. X    }
  378. X    return c;
  379. X}
  380. X
  381. X/*
  382. X * cond_2    : BANG cond_2
  383. X                | INPAR { SEPER } cond_2 { SEPER } OUTPAR
  384. X                | STRING STRING STRING
  385. X                | STRING STRING
  386. X                | STRING ( INANG | OUTANG ) STRING
  387. X */
  388. XCond par_cond_2() /**/
  389. X{
  390. XCond c,c2;
  391. Xchar *s1,*s2,*s3;
  392. Xint xtok;
  393. X
  394. X    if (tok == BANG) {
  395. X        yylex();
  396. X        c = par_cond_2();
  397. X        c2 = make_cond();
  398. X        c2->left = c;
  399. X        c2->type = COND_NOT;
  400. X        return c2;
  401. X    }
  402. X    if (tok == INPAR) {
  403. X        yylex();
  404. X        while (tok == SEPER) yylex();
  405. X        c = par_cond();
  406. X        while (tok == SEPER) yylex();
  407. X        if (tok != OUTPAR) YYERROR;
  408. X        yylex();
  409. X        return c;
  410. X    }
  411. X    if (tok != STRING) YYERROR;
  412. X    s1 = tokstr;
  413. X    yylex();
  414. X    xtok = tok;
  415. X    if (tok == INANG || tok == OUTANG) {
  416. X        yylex();
  417. X        if (tok != STRING) YYERROR;
  418. X        s3 = tokstr;
  419. X        yylex();
  420. X        c = make_cond();
  421. X        c->left = s1;
  422. X        c->right = s3;
  423. X        c->type = (xtok == INANG) ? COND_STRLT : COND_STRGTR;
  424. X        c->types[0] = c->types[1] = NT_STR;
  425. X        return c;
  426. X    }
  427. X    if (tok != STRING) YYERROR;
  428. X    s2 = tokstr;
  429. X    yylex();
  430. X    if (tok == STRING) {
  431. X        s3 = tokstr;
  432. X        yylex();
  433. X        return par_cond_triple(s1,s2,s3);
  434. X    } else
  435. X        return par_cond_double(s1,s2);
  436. X}
  437. X
  438. X/*
  439. X * redir    : ( OUTANG | ... | TRINANG ) STRING
  440. X */
  441. Xvoid par_redir(l) /**/
  442. XLklist l;
  443. X{
  444. Xchar *toks;
  445. Xstruct redir *fn = allocnode(N_REDIR);
  446. Xint mergerror = 0;
  447. Xint oldcmdpos;
  448. X
  449. X    oldcmdpos = incmdpos;
  450. X    incmdpos = 0;
  451. X    fn->type = redirtab[tok-OUTANG];
  452. X    fn->fd1 = tokfd;
  453. X    yylex();
  454. X    if (tok != STRING && tok != ENVSTRING) YYERRORV;
  455. X    toks = tokstr;
  456. X    incmdpos = oldcmdpos;
  457. X    yylex();
  458. X
  459. X/* assign default fd */
  460. X
  461. X    if (fn->fd1 == -1)
  462. X        fn->fd1 = IS_READFD(fn->type) ? 0 : 1;
  463. X
  464. X/* > >(...) or < <(...) */
  465. X
  466. X    if ((*toks == Inang || *toks == Outang) && toks[1] == Inpar) {
  467. X        if (fn->type == WRITE)
  468. X            fn->type = OUTPIPE;
  469. X        else if (fn->type == READ)
  470. X            fn->type = INPIPE;
  471. X        else
  472. X            YYERRORV;
  473. X        fn->name = toks;
  474. X
  475. X/* <<[-] name */
  476. X
  477. X    } else if (fn->type == HEREDOC || fn->type == HEREDOCDASH) {
  478. X        fn->name = gethere(toks,fn->type);
  479. X        fn->type = HERESTR;
  480. X
  481. X/* >& name or >>& name */
  482. X
  483. X    } else if (IS_ERROR_REDIR(fn->type) && getfdstr(toks) == -1) {
  484. X        mergerror = 1;
  485. X        fn->name = toks;
  486. X        fn->type = UN_ERROR_REDIR(fn->type);
  487. X
  488. X/* >>& and >>&! are only valid with a name after them */
  489. X
  490. X    } else if (fn->type == ERRAPP || fn->type == ERRAPPNOW) {
  491. X        YYERRORV;
  492. X
  493. X/* >& # */
  494. X
  495. X    } else if (fn->type == MERGEOUT) {
  496. X        struct redir *fe = allocnode(N_REDIR);
  497. X
  498. X        fn->type = CLOSE;
  499. X        addnode(l,fn);
  500. X        fe->fd1 = fn->fd1;
  501. X        fe->fd2 = getfdstr(toks);
  502. X        if (fe->fd2 == -2)
  503. X            fe->fd2 = coprocout;
  504. X        fe->type = MERGEOUT;
  505. X        fn = fe;
  506. X    } else if (fn->type == MERGE || fn->type == MERGEOUT) {
  507. X        if (*toks == '-')
  508. X            fn->type = CLOSE;
  509. X        else {
  510. X            fn->fd2 = getfdstr(toks);
  511. X            if (fn->fd2 == -2)
  512. X                fn->fd2 = (fn->type == MERGEOUT) ? coprocout : coprocin;
  513. X        }
  514. X    } else
  515. X        fn->name = toks;
  516. X    addnode(l,fn);
  517. X    if (mergerror)
  518. X        {
  519. X        struct redir *fe = allocnode(N_REDIR);
  520. X
  521. X        fe->fd1 = 2;
  522. X        fe->fd2 = fn->fd1;
  523. X        fe->type = MERGEOUT;
  524. X        addnode(l,fe);
  525. X        }
  526. X}
  527. X
  528. X/*
  529. X * wordlist    : { STRING }
  530. X */
  531. XLklist par_wordlist() /**/
  532. X{
  533. XLklist l;
  534. X
  535. X    l = newlist();
  536. X    while (tok == STRING) {
  537. X        addnode(l,tokstr);
  538. X        yylex();
  539. X    }
  540. X    return l;
  541. X}
  542. X
  543. X/*
  544. X * nl_wordlist    : { STRING | SEPER }
  545. X */
  546. XLklist par_nl_wordlist() /**/
  547. X{
  548. XLklist l;
  549. X
  550. X    l = newlist();
  551. X    while (tok == STRING || tok == SEPER) {
  552. X        if (tok != SEPER)
  553. X            addnode(l,tokstr);
  554. X        yylex();
  555. X    }
  556. X    return l;
  557. X}
  558. X
  559. X/* get fd associated with str */
  560. X
  561. Xint getfdstr(s) /**/
  562. Xchar *s;
  563. X{
  564. X    if (s[1])
  565. X        return -1;
  566. X    if (idigit(*s))
  567. X        return *s-'0';
  568. X    if (*s == 'p')
  569. X        return -2;
  570. X    return -1;
  571. X}
  572. X
  573. XCond par_cond_double(a,b) /**/
  574. Xchar *a;char *b;
  575. X{
  576. XCond n = make_cond();
  577. X
  578. X    if (a[0] != '-' || !a[1] || a[2])
  579. X        {
  580. X        zerr("parse error: condition expected: %s",a,0);
  581. X        return NULL;
  582. X        }
  583. X    n->left = b;
  584. X    n->type = a[1];
  585. X    n->types[0] = n->types[1] = NT_STR;
  586. X    return n;
  587. X}
  588. X
  589. XCond par_cond_triple(a,b,c) /**/
  590. Xchar *a;char *b;char *c;
  591. X{
  592. XCond n = make_cond();
  593. Xstatic char *condstrs[] = {
  594. X    "nt","ot","ef","eq","ne","lt","gt","le","ge",NULL
  595. X    };
  596. Xint t0;
  597. X
  598. X    if ((b[0] == Equals || b[0] == '=') && !b[1])
  599. X        n->type = COND_STREQ;
  600. X    else if (b[0] == '!' && b[1] == '=' && !b[2])
  601. X        n->type = COND_STRNEQ;
  602. X    else if (b[0] == '-')
  603. X        {
  604. X        for (t0 = 0; condstrs[t0]; t0++)
  605. X            if (!strcmp(condstrs[t0],b+1))
  606. X                break;
  607. X        if (condstrs[t0])
  608. X            n->type = t0+COND_NT;
  609. X        else
  610. X            zerr("unrecognized condition: %s",b,0);
  611. X        }
  612. X    else
  613. X        zerr("condition expected: %s",b,0);
  614. X    n->left = a;
  615. X    n->right = c;
  616. X    n->types[0] = n->types[1] = NT_STR;
  617. X    return n;
  618. X}
  619. X
  620. Xvoid yyerror() /**/
  621. X{
  622. Xint t0;
  623. X
  624. X    for (t0 = 0; t0 != 20; t0++)
  625. X        if (!yytext[t0] || yytext[t0] == '\n' || yytext[t0] == HISTSPACE)
  626. X            break;
  627. X    if (t0 == 20)
  628. X        zerr("parse error near `%l...'",yytext,20);
  629. X    else if (t0)
  630. X        zerr("parse error near `%l'",yytext,t0);
  631. X    else
  632. X        zerr("parse error",NULL,0);
  633. X}
  634. X
  635. SHAR_EOF
  636. echo 'File zsh2.1/src/parse.c is complete' &&
  637. chmod 0644 zsh2.1/src/parse.c ||
  638. echo 'restore of zsh2.1/src/parse.c failed'
  639. Wc_c="`wc -c < 'zsh2.1/src/parse.c'`"
  640. test 18604 -eq "$Wc_c" ||
  641.     echo 'zsh2.1/src/parse.c: original size 18604, current size' "$Wc_c"
  642. rm -f _shar_wnt_.tmp
  643. fi
  644. # ============= zsh2.1/src/zle_utils.pro ==============
  645. if test -f 'zsh2.1/src/zle_utils.pro' -a X"$1" != X"-c"; then
  646.     echo 'x - skipping zsh2.1/src/zle_utils.pro (File already exists)'
  647.     rm -f _shar_wnt_.tmp
  648. else
  649. > _shar_wnt_.tmp
  650. echo 'x - extracting zsh2.1/src/zle_utils.pro (Text)'
  651. sed 's/^X//' << 'SHAR_EOF' > 'zsh2.1/src/zle_utils.pro' &&
  652. Xvoid sizeline DCLPROTO((int sz));
  653. Xvoid spaceinline DCLPROTO((int ct));
  654. Xvoid backkill DCLPROTO((int ct,int dir));
  655. Xvoid forekill DCLPROTO((int ct,int dir));
  656. Xvoid cut DCLPROTO((int i,int ct,int dir));
  657. Xvoid backdel DCLPROTO((int ct));
  658. Xvoid foredel DCLPROTO((int ct));
  659. Xvoid setline DCLPROTO((char *s));
  660. Xvoid sethistline DCLPROTO((char *s));
  661. Xint findbol DCLPROTO((void));
  662. Xint findeol DCLPROTO((void));
  663. Xvoid findline DCLPROTO((int *a,int *b));
  664. Xvoid initundo DCLPROTO((void));
  665. Xvoid addundo DCLPROTO((void));
  666. Xvoid freeundo DCLPROTO((void));
  667. Xint hstrncmp DCLPROTO((char *s,char *t,int len));
  668. Xint hstrcmp DCLPROTO((char *s,char *t));
  669. Xchar *hstrnstr DCLPROTO((char *s,char *t,int len));
  670. SHAR_EOF
  671. chmod 0644 zsh2.1/src/zle_utils.pro ||
  672. echo 'restore of zsh2.1/src/zle_utils.pro failed'
  673. Wc_c="`wc -c < 'zsh2.1/src/zle_utils.pro'`"
  674. test 675 -eq "$Wc_c" ||
  675.     echo 'zsh2.1/src/zle_utils.pro: original size 675, current size' "$Wc_c"
  676. rm -f _shar_wnt_.tmp
  677. fi
  678. # ============= zsh2.1/src/signals.h.sample ==============
  679. if test -f 'zsh2.1/src/signals.h.sample' -a X"$1" != X"-c"; then
  680.     echo 'x - skipping zsh2.1/src/signals.h.sample (File already exists)'
  681.     rm -f _shar_wnt_.tmp
  682. else
  683. > _shar_wnt_.tmp
  684. echo 'x - extracting zsh2.1/src/signals.h.sample (Text)'
  685. sed 's/^X//' << 'SHAR_EOF' > 'zsh2.1/src/signals.h.sample' &&
  686. XYour signals.h file should look something like this.  If it doesn't,
  687. Xperhaps your csh or ed is different.
  688. X
  689. X/* this file is created automatically by buildzsh */
  690. X/* if all this is wrong, blame csh ;-) */
  691. X
  692. X#define SIGCOUNT       31
  693. X
  694. X#ifdef GLOBALS
  695. X
  696. Xchar *sigmsg[SIGCOUNT+2] = {
  697. X    "done",
  698. X    "hangup",
  699. X    "interrupt",
  700. X    "quit",
  701. X    "illegal instruction",
  702. X    "trace trap",
  703. X    "abort",
  704. X    "EMT instruction",
  705. X    "floating point exception",
  706. X    "killed",
  707. X    "bus error",
  708. X    "segmentation fault",
  709. X    "bad system call",
  710. X    "broken pipe",
  711. X    "SIGALRM",
  712. X    "terminated",
  713. X    "SIGURG",
  714. X#ifdef USE_SUSPENDED
  715. X    "suspended (signal)",
  716. X#else
  717. X    "stopped (signal)",
  718. X#endif
  719. X#ifdef USE_SUSPENDED
  720. X    "suspended",
  721. X#else
  722. X    "stopped",
  723. X#endif
  724. X    "continued",
  725. X    "SIGCHLD",
  726. X#ifdef USE_SUSPENDED
  727. X    "suspended (tty input)",
  728. X#else
  729. X    "stopped (tty input)",
  730. X#endif
  731. X#ifdef USE_SUSPENDED
  732. X    "suspended (tty output)",
  733. X#else
  734. X    "stopped (tty output)",
  735. X#endif
  736. X    "SIGIO",
  737. X    "cpu limit exceeded",
  738. X    "filesize limit exceeded",
  739. X    "virtual time alarm",
  740. X    "SIGPROF",
  741. X    "SIGWINCH",
  742. X    "SIGLOST",
  743. X    "SIGUSR1",
  744. X    "SIGUSR2",
  745. X    NULL
  746. X};
  747. X
  748. Xchar *sigs[SIGCOUNT+4] = {
  749. X    "EXIT",
  750. X    "HUP",
  751. X    "INT",
  752. X    "QUIT",
  753. X    "ILL",
  754. X    "TRAP",
  755. X    "ABRT",
  756. X    "EMT",
  757. X    "FPE",
  758. X    "KILL",
  759. X    "BUS",
  760. X    "SEGV",
  761. X    "SYS",
  762. X    "PIPE",
  763. X    "ALRM",
  764. X    "TERM",
  765. X    "URG",
  766. X    "STOP",
  767. X    "TSTP",
  768. X    "CONT",
  769. X    "CHLD",
  770. X    "TTIN",
  771. X    "TTOU",
  772. X    "IO",
  773. X    "XCPU",
  774. X    "XFSZ",
  775. X    "VTALRM",
  776. X    "PROF",
  777. X    "WINCH",
  778. X    "LOST",
  779. X    "USR1",
  780. X    "USR2",
  781. X    "ERR",
  782. X    "DEBUG",
  783. X    NULL
  784. X};
  785. X
  786. X#else
  787. X
  788. Xextern char *sigs[SIGCOUNT+4],*sigmsg[SIGCOUNT+2];
  789. X
  790. X#endif
  791. SHAR_EOF
  792. chmod 0644 zsh2.1/src/signals.h.sample ||
  793. echo 'restore of zsh2.1/src/signals.h.sample failed'
  794. Wc_c="`wc -c < 'zsh2.1/src/signals.h.sample'`"
  795. test 1429 -eq "$Wc_c" ||
  796.     echo 'zsh2.1/src/signals.h.sample: original size 1429, current size' "$Wc_c"
  797. rm -f _shar_wnt_.tmp
  798. fi
  799. # ============= zsh2.1/src/zle_move.c ==============
  800. if test -f 'zsh2.1/src/zle_move.c' -a X"$1" != X"-c"; then
  801.     echo 'x - skipping zsh2.1/src/zle_move.c (File already exists)'
  802.     rm -f _shar_wnt_.tmp
  803. else
  804. > _shar_wnt_.tmp
  805. echo 'x - extracting zsh2.1/src/zle_move.c (Text)'
  806. sed 's/^X//' << 'SHAR_EOF' > 'zsh2.1/src/zle_move.c' &&
  807. X/*
  808. X
  809. X    zle_move.c - editor movement
  810. X
  811. X    This file is part of zsh, the Z shell.
  812. X
  813. X    zsh is free software; no one can prevent you from reading the source
  814. X   code, or giving it to someone else.
  815. X
  816. X   This file is copyrighted under the GNU General Public License, which
  817. X   can be found in the file called COPYING.
  818. X
  819. X   Copyright (C) 1990, 1991 Paul Falstad
  820. X
  821. X   zsh is distributed in the hope that it will be useful, but
  822. X   WITHOUT ANY WARRANTY.  No author or distributor accepts
  823. X   responsibility to anyone for the consequences of using it or for
  824. X   whether it serves any particular purpose or works at all, unless he
  825. X   says so in writing.  Refer to the GNU General Public License
  826. X   for full details.
  827. X
  828. X   Everyone is granted permission to copy, modify and redistribute
  829. X   zsh, but only under the conditions described in the GNU General Public
  830. X   License.   A copy of this license is supposed to have been given to you
  831. X   along with zsh so you can know your rights and responsibilities.
  832. X   It should be in a file named COPYING.
  833. X
  834. X   Among other things, the copyright notice and this notice must be
  835. X   preserved on all copies.
  836. X
  837. X*/
  838. X
  839. X#define ZLE
  840. X#include "zsh.h"
  841. X
  842. X
  843. Xvoid beginningofline() /**/
  844. X{
  845. X    if (mult < 0) { mult = -mult; endofline(); return; }
  846. X    while (mult--) {
  847. X        if (cs == 0)
  848. X            return;
  849. X        if (line[cs-1] == '\n')
  850. X            if (!--cs)
  851. X                return;
  852. X        while (cs && line[cs-1] != '\n') cs--;
  853. X    }
  854. X}
  855. X
  856. Xvoid endofline() /**/
  857. X{
  858. X    if (mult < 0) { mult = -mult; beginningofline(); return; }
  859. X    while (mult--) {
  860. X        if (cs >= ll) {
  861. X            cs = ll;
  862. X            return;
  863. X        }
  864. X        if (line[cs] == '\n')
  865. X            if (++cs == ll)
  866. X                return;
  867. X        while (cs != ll && line[cs] != '\n') cs++;
  868. X    }
  869. X}
  870. X
  871. Xvoid beginningoflinehist() /**/
  872. X{
  873. X    if (mult < 0) { mult = -mult; endoflinehist(); return; }
  874. X    while (mult) {
  875. X        if (cs == 0)
  876. X            break;
  877. X        if (line[cs-1] == '\n')
  878. X            if (!--cs)
  879. X                break;
  880. X        while (cs && line[cs-1] != '\n') cs--;
  881. X        mult--;
  882. X    }
  883. X    if (mult) {
  884. X        uphistory();
  885. X        cs = 0;
  886. X    }
  887. X}
  888. X
  889. Xvoid endoflinehist() /**/
  890. X{
  891. X    if (mult < 0) { mult = -mult; beginningoflinehist(); return; }
  892. X    while (mult) {
  893. X        if (cs >= ll) {
  894. X            cs = ll;
  895. X            break;
  896. X        }
  897. X        if (line[cs] == '\n')
  898. X            if (++cs == ll)
  899. X                break;
  900. X        while (cs != ll && line[cs] != '\n') cs++;
  901. X        mult--;
  902. X    }
  903. X    if (mult)
  904. X        downhistory();
  905. X}
  906. X
  907. Xvoid forwardchar() /**/
  908. X{
  909. X    cs += mult;
  910. X    if (cs > ll) cs = ll;
  911. X    if (cs <  0) cs = 0;
  912. X}
  913. X
  914. Xvoid backwardchar() /**/
  915. X{
  916. X    cs -= mult;
  917. X    if (cs > ll) cs = ll;
  918. X    if (cs <  0) cs = 0;
  919. X}
  920. X
  921. Xvoid setmarkcommand() /**/
  922. X{
  923. X    mark = cs;
  924. X}
  925. X
  926. Xvoid exchangepointandmark() /**/
  927. X{
  928. Xint x;
  929. X
  930. X    x = mark;
  931. X    mark = cs;
  932. X    cs = x;
  933. X    if (cs > ll)
  934. X        cs = ll;
  935. X}
  936. X
  937. Xvoid vigotocolumn() /**/
  938. X{
  939. Xint x,y,ocs = cs;
  940. X
  941. X    if (mult > 0) mult--;
  942. X    findline(&x,&y);
  943. X    if (mult >= 0) cs = x+mult; else cs = y+mult;
  944. X    if (cs < x || cs > y) {
  945. X        feep();
  946. X        cs = ocs;
  947. X    }
  948. X}
  949. X
  950. Xvoid vimatchbracket() /**/
  951. X{
  952. Xint ocs = cs,dir,ct;
  953. Xchar oth,me;
  954. X
  955. Xotog:
  956. X    if (cs == ll)
  957. X        {
  958. X        feep();
  959. X        cs = ocs;
  960. X        return;
  961. X        }
  962. X    switch(me = line[cs])
  963. X        {
  964. X        case '{': dir = 1; oth = '}'; break;
  965. X        case '}': dir = -1; oth = '{'; break;
  966. X        case '(': dir = 1; oth = ')'; break;
  967. X        case ')': dir = -1; oth = '('; break;
  968. X        case '[': dir = 1; oth = ']'; break;
  969. X        case ']': dir = -1; oth = '['; break;
  970. X        default: cs++; goto otog;
  971. X        }
  972. X    ct = 1;
  973. X    while (cs >= 0 && cs < ll && ct)
  974. X        {
  975. X        cs += dir;
  976. X        if (line[cs] == oth)
  977. X            ct--;
  978. X        else if (line[cs] == me)
  979. X            ct++;
  980. X        }
  981. X    if (cs < 0 || cs >= ll)
  982. X        {
  983. X        feep();
  984. X        cs = ocs;
  985. X        }
  986. X}
  987. X
  988. Xvoid viforwardchar() /**/
  989. X{
  990. X    if (mult < 0) { mult = -mult; vibackwardchar(); return; }
  991. X    while (mult--) {
  992. X        cs++;
  993. X        if (cs >= ll || line[cs] == '\n') {
  994. X            cs--;
  995. X            break;
  996. X        }
  997. X    }
  998. X}
  999. X
  1000. Xvoid vibackwardchar() /**/
  1001. X{
  1002. X    if (mult < 0) { mult = -mult; viforwardchar(); return; }
  1003. X    while (mult--) {
  1004. X        cs--;
  1005. X        if (cs < 0 || line[cs] == '\n') {
  1006. X            cs++;
  1007. X            break;
  1008. X        }
  1009. X    }
  1010. X}
  1011. X
  1012. Xvoid viendofline() /**/
  1013. X{
  1014. X    cs = findeol();
  1015. X    if (!virangeflag && cs != 0 && line[cs-1] != '\n') cs--;
  1016. X}
  1017. X
  1018. Xvoid vibeginningofline() /**/
  1019. X{
  1020. X    cs = findbol();
  1021. X}
  1022. X
  1023. X
  1024. Xstatic int vfindchar,vfinddir,tailadd;
  1025. X
  1026. Xvoid vifindnextchar() /**/
  1027. X{
  1028. X    if (vfindchar = vigetkey())
  1029. X        {
  1030. X        vfinddir = 1;
  1031. X        tailadd = 0;
  1032. X        virepeatfind();
  1033. X        }
  1034. X}
  1035. X
  1036. Xvoid vifindprevchar() /**/
  1037. X{
  1038. X    if (vfindchar = vigetkey())
  1039. X        {
  1040. X        vfinddir = -1;
  1041. X        tailadd = 0;
  1042. X        virepeatfind();
  1043. X        }
  1044. X}
  1045. X
  1046. Xvoid vifindnextcharskip() /**/
  1047. X{
  1048. X    if (vfindchar = vigetkey())
  1049. X        {
  1050. X        vfinddir = 1;
  1051. X        tailadd = -1;
  1052. X        virepeatfind();
  1053. X        }
  1054. X}
  1055. X
  1056. Xvoid vifindprevcharskip() /**/
  1057. X{
  1058. X    if (vfindchar = vigetkey())
  1059. X        {
  1060. X        vfinddir = -1;
  1061. X        tailadd = 1;
  1062. X        virepeatfind();
  1063. X        }
  1064. X}
  1065. X
  1066. Xvoid virepeatfind() /**/
  1067. X{
  1068. Xint ocs = cs;
  1069. X
  1070. X    if (mult < 0) { mult = -mult; virevrepeatfind(); return; }
  1071. X    while (mult--)
  1072. X        {
  1073. X        do
  1074. X            cs += vfinddir;
  1075. X        while (cs >= 0 && cs < ll && line[cs] != vfindchar && line[cs] != '\n');
  1076. X        if (cs < 0 || cs >= ll || line[cs] == '\n')
  1077. X            {
  1078. X            feep();
  1079. X            cs = ocs;
  1080. X            return;
  1081. X            }
  1082. X        }
  1083. X    cs += tailadd;
  1084. X}
  1085. X
  1086. Xvoid virevrepeatfind() /**/
  1087. X{
  1088. X    if (mult < 0) { mult = -mult; virepeatfind(); return; }
  1089. X    vfinddir = -vfinddir;
  1090. X    virepeatfind();
  1091. X    vfinddir = -vfinddir;
  1092. X}
  1093. X
  1094. Xvoid vifirstnonblank() /**/
  1095. X{
  1096. X    cs = findbol();
  1097. X    while (cs != ll && iblank(line[cs]))
  1098. X        cs++;
  1099. X}
  1100. X
  1101. Xvoid visetmark() /**/
  1102. X{
  1103. Xint ch;
  1104. X
  1105. X    ch = getkey(1);
  1106. X    if (ch < 'a' || ch > 'z') {
  1107. X        feep();
  1108. X        return;
  1109. X    }
  1110. X    ch -= 'a';
  1111. X    vimarkcs[ch] = cs;
  1112. X    vimarkline[ch] = histline;
  1113. X}
  1114. X
  1115. Xvoid vigotomark() /**/
  1116. X{
  1117. Xint ch;
  1118. X
  1119. X    ch = getkey(1);
  1120. X    if (ch == c) ch = 26;
  1121. X    else {
  1122. X        if (ch < 'a' || ch > 'z') {
  1123. X            feep();
  1124. X            return;
  1125. X        }
  1126. X        ch -= 'a';
  1127. X    }
  1128. X    if (!vimarkline[ch]) {
  1129. X        feep();
  1130. X        return;
  1131. X    }
  1132. X    if (curhist != vimarkline[ch]) {
  1133. X        mult = vimarkline[ch];
  1134. X        vifetchhistory();
  1135. X        if (curhist != vimarkline[ch]) return;
  1136. X    }
  1137. X    cs = vimarkcs[ch];
  1138. X    if (cs > ll) ch = ll;
  1139. X}
  1140. X
  1141. Xvoid vigotomarkline() /**/
  1142. X{
  1143. X    vigotomark();
  1144. X    cs = findbol();
  1145. X}
  1146. SHAR_EOF
  1147. chmod 0644 zsh2.1/src/zle_move.c ||
  1148. echo 'restore of zsh2.1/src/zle_move.c failed'
  1149. Wc_c="`wc -c < 'zsh2.1/src/zle_move.c'`"
  1150. test 5546 -eq "$Wc_c" ||
  1151.     echo 'zsh2.1/src/zle_move.c: original size 5546, current size' "$Wc_c"
  1152. rm -f _shar_wnt_.tmp
  1153. fi
  1154. # ============= zsh2.1/src/zle_misc.c ==============
  1155. if test -f 'zsh2.1/src/zle_misc.c' -a X"$1" != X"-c"; then
  1156.     echo 'x - skipping zsh2.1/src/zle_misc.c (File already exists)'
  1157.     rm -f _shar_wnt_.tmp
  1158. else
  1159. > _shar_wnt_.tmp
  1160. echo 'x - extracting zsh2.1/src/zle_misc.c (Text)'
  1161. sed 's/^X//' << 'SHAR_EOF' > 'zsh2.1/src/zle_misc.c' &&
  1162. X/*
  1163. X
  1164. X    zle_misc.c - miscellaneous editor routines
  1165. X
  1166. X    This file is part of zsh, the Z shell.
  1167. X
  1168. X    zsh is free software; no one can prevent you from reading the source
  1169. X   code, or giving it to someone else.
  1170. X
  1171. X   This file is copyrighted under the GNU General Public License, which
  1172. X   can be found in the file called COPYING.
  1173. X
  1174. X   Copyright (C) 1990, 1991 Paul Falstad
  1175. X
  1176. X   zsh is distributed in the hope that it will be useful, but
  1177. X   WITHOUT ANY WARRANTY.  No author or distributor accepts
  1178. X   responsibility to anyone for the consequences of using it or for
  1179. X   whether it serves any particular purpose or works at all, unless he
  1180. X   says so in writing.  Refer to the GNU General Public License
  1181. X   for full details.
  1182. X
  1183. X   Everyone is granted permission to copy, modify and redistribute
  1184. X   zsh, but only under the conditions described in the GNU General Public
  1185. X   License.   A copy of this license is supposed to have been given to you
  1186. X   along with zsh so you can know your rights and responsibilities.
  1187. X   It should be in a file named COPYING.
  1188. X
  1189. X   Among other things, the copyright notice and this notice must be
  1190. X   preserved on all copies.
  1191. X
  1192. X*/
  1193. X
  1194. X#define ZLE
  1195. X#include "zsh.h"
  1196. X
  1197. X
  1198. Xvoid selfinsert() /**/
  1199. X{
  1200. Xint ncs = cs+mult;
  1201. X
  1202. X    if (mult < 0) { mult = -mult; ncs = cs; }
  1203. X    if (insmode || ll == cs)
  1204. X        spaceinline(mult);
  1205. X    else if (mult+cs > ll)
  1206. X        spaceinline(ll-(mult+cs));
  1207. X    while (mult--)
  1208. X        line[cs++] = c;
  1209. X    cs = ncs;
  1210. X}
  1211. X
  1212. Xvoid selfinsertunmeta() /**/
  1213. X{
  1214. X    c &= 0x7f;
  1215. X    if (c == '\r') c = '\n';
  1216. X    selfinsert();
  1217. X}
  1218. X
  1219. Xvoid deletechar() /**/
  1220. X{
  1221. X    if (mult < 0) { mult = -mult; backwarddeletechar(); return; }
  1222. X    if (c == 4 && !ll)
  1223. X        {
  1224. X        eofsent = 1;
  1225. X        return;
  1226. X        }
  1227. X    if (!(cs+mult > ll || line[cs] == '\n'))
  1228. X        {
  1229. X        cs += mult;
  1230. X        backdel(mult);
  1231. X        }
  1232. X    else
  1233. X        feep();
  1234. X}
  1235. X
  1236. Xvoid backwarddeletechar() /**/
  1237. X{
  1238. X    if (mult < 0) { mult = -mult; deletechar(); return; }
  1239. X    if (mult > cs)
  1240. X        mult = cs;
  1241. X    backdel(mult);
  1242. X}
  1243. X
  1244. Xvoid videletechar() /**/
  1245. X{
  1246. X    if (mult < 0) { mult = -mult; vibackwarddeletechar(); return; }
  1247. X    if (c == 4 && !ll) {
  1248. X        eofsent = 1;
  1249. X        return;
  1250. X    }
  1251. X    if (!(cs+mult > ll || line[cs] == '\n')) {
  1252. X        cs += mult;
  1253. X        backkill(mult,0);
  1254. X        if (cs && (cs == ll || line[cs] == '\n')) cs--;
  1255. X    } else
  1256. X        feep();
  1257. X}
  1258. X
  1259. Xvoid vibackwarddeletechar() /**/
  1260. X{
  1261. X    if (mult < 0) { mult = -mult; videletechar(); return; }
  1262. X    if (mult > cs)
  1263. X        mult = cs;
  1264. X    if (cs-mult < viinsbegin) { feep(); return; }
  1265. X    backkill(mult,1);
  1266. X}
  1267. X
  1268. Xvoid vikillline() /**/
  1269. X{
  1270. X    if (viinsbegin > cs) { feep(); return; }
  1271. X    backdel(cs-viinsbegin);
  1272. X}
  1273. X
  1274. Xvoid killwholeline() /**/
  1275. X{
  1276. Xint i,fg;
  1277. X
  1278. X    if (mult < 0) return;
  1279. X    while (mult--)
  1280. X        {
  1281. X        if (fg = (cs && cs == ll))
  1282. X            cs--;
  1283. X        while (cs && line[cs-1] != '\n') cs--;
  1284. X        for (i = cs; i != ll && line[i] != '\n'; i++);
  1285. X        forekill(i-cs+(i != ll),fg);
  1286. X        }
  1287. X}
  1288. X
  1289. Xvoid killbuffer() /**/
  1290. X{
  1291. X    cs = 0;
  1292. X    forekill(ll,0);
  1293. X}
  1294. X
  1295. Xvoid backwardkillline() /**/
  1296. X{
  1297. Xint i = 0;
  1298. X
  1299. X    if (mult < 0) { mult = -mult; killline(); return; }
  1300. X    while (mult--)
  1301. X        {
  1302. X        while (cs && line[cs-1] != '\n') cs--,i++;
  1303. X        if (mult && cs && line[cs-1] == '\n')
  1304. X            cs--,i++;
  1305. X        }
  1306. X    forekill(i,1);
  1307. X}
  1308. X
  1309. Xvoid gosmacstransposechars() /**/
  1310. X{
  1311. Xint cc;
  1312. X
  1313. X    if (cs < 2 || line[cs-1] == '\n' || line[cs-2] == '\n')
  1314. X        {
  1315. X        if (line[cs] == '\n' || line[cs+1] == '\n')
  1316. X            {
  1317. X            feep();
  1318. X            return;
  1319. X            }
  1320. X        cs += (cs == 0 || line[cs-1] == '\n') ? 2 : 1;
  1321. X        }
  1322. X    cc = line[cs-2];
  1323. X    line[cs-2] = line[cs-1];
  1324. X    line[cs-1] = cc;
  1325. X}
  1326. X
  1327. Xvoid transposechars() /**/
  1328. X{
  1329. Xint cc;
  1330. Xint neg = mult < 0;
  1331. X
  1332. X    if (neg) mult = -mult;
  1333. X    while (mult--) {
  1334. X        if (cs == 0 || line[cs-1] == '\n') {
  1335. X            if (ll == cs || line[cs] == '\n' || line[cs+1] == '\n') {
  1336. X                feep();
  1337. X                return;
  1338. X            }
  1339. X            cs++;
  1340. X        }
  1341. X        if (!neg) {
  1342. X            if (cs != ll && line[cs] != '\n') cs++;
  1343. X        } else {
  1344. X            if (cs != 0 && line[cs-1] != '\n') cs--;
  1345. X        }
  1346. X        cc = line[cs-2];
  1347. X        line[cs-2] = line[cs-1];
  1348. X        line[cs-1] = cc;
  1349. X    }
  1350. X}
  1351. X
  1352. Xvoid acceptline() /**/
  1353. X{
  1354. X    done = 1;
  1355. X}
  1356. X
  1357. Xvoid acceptandhold() /**/
  1358. X{
  1359. X    pushnode(bufstack,ztrdup(line));
  1360. X    stackcs = cs;
  1361. X    done = 1;
  1362. X}
  1363. X
  1364. Xvoid killline() /**/
  1365. X{
  1366. Xint i = 0;
  1367. X
  1368. X    if (mult < 0) { mult = -mult; backwardkillline(); return; }
  1369. X    while (mult--) {
  1370. X        if (line[cs] == '\n')
  1371. X            cs++,i++;
  1372. X        while (cs != ll && line[cs] != '\n') cs++,i++;
  1373. X    }
  1374. X    backkill(i,0);
  1375. X}
  1376. X
  1377. Xvoid killregion() /**/
  1378. X{
  1379. X    if (mark > ll)
  1380. X        mark = ll;
  1381. X    if (mark > cs)
  1382. X        forekill(mark-cs,0);
  1383. X    else
  1384. X        backkill(cs-mark,1);
  1385. X}
  1386. X
  1387. Xvoid copyregionaskill() /**/
  1388. X{
  1389. X    if (mark > ll)
  1390. X        mark = ll;
  1391. X    if (mark > cs)
  1392. X        cut(cs,mark-cs,0);
  1393. X    else
  1394. X        cut(mark,cs-mark,1);
  1395. X}
  1396. X
  1397. Xstatic int kct,yankb,yanke;
  1398. X
  1399. Xvoid yank() /**/
  1400. X{
  1401. Xint cc;
  1402. Xchar *buf = cutbuf;
  1403. X
  1404. X    if (!cutbuf) {
  1405. X        feep();
  1406. X        return;
  1407. X    }
  1408. X    if (mult < 0) return;
  1409. X    if (vibufspec) {
  1410. X        vibufspec = tolower(vibufspec);
  1411. X        vibufspec += (idigit(vibufspec)) ? -'1'+26 : -'a';
  1412. X        if (!(buf = vibuf[vibufspec])) {
  1413. X            feep();
  1414. X            vibufspec = 0;
  1415. X            return;
  1416. X        }
  1417. X        vibufspec = 0;
  1418. X    }
  1419. X    yankb = cs;
  1420. X    while (mult--) {
  1421. X        kct = kringnum;
  1422. X        cc = strlen(buf);
  1423. X        spaceinline(cc);
  1424. X        strncpy(line+cs,buf,cc);
  1425. X        cs += cc;
  1426. X        yanke = cs;
  1427. X    }
  1428. X}
  1429. X
  1430. Xvoid viputafter() /**/
  1431. X{
  1432. Xint cc;
  1433. Xchar *buf = cutbuf;
  1434. X
  1435. X    if (!cutbuf) {
  1436. X        feep();
  1437. X        return;
  1438. X    }
  1439. X    if (mult < 0) return;
  1440. X    if (vibufspec) {
  1441. X        vibufspec = tolower(vibufspec);
  1442. X        vibufspec += (idigit(vibufspec)) ? -'1'+26 : -'a';
  1443. X        if (!(buf = vibuf[vibufspec])) {
  1444. X            feep();
  1445. X            vibufspec = 0;
  1446. X            return;
  1447. X        }
  1448. X        vibufspec = 0;
  1449. X    }
  1450. X    if (strchr(buf,'\n')) {
  1451. X        cs = findeol();
  1452. X        if (cs == ll) { spaceinline(1); line[cs] = '\n'; }
  1453. X    }
  1454. X    if (cs != ll) cs++;
  1455. X    yankb = cs;
  1456. X    while (mult--) {
  1457. X        kct = kringnum;
  1458. X        cc = strlen(buf);
  1459. X        spaceinline(cc);
  1460. X        strncpy(line+cs,buf,cc);
  1461. X        cs += cc;
  1462. X        yanke = cs;
  1463. X    }
  1464. X    cs = yankb;
  1465. X}
  1466. X
  1467. Xvoid yankpop() /**/
  1468. X{
  1469. Xint cc;
  1470. X
  1471. X    if (!(lastcmd & ZLE_YANK) || !kring[kct]) {
  1472. X        feep();
  1473. X        return;
  1474. X    }
  1475. X    cs = yankb;
  1476. X    foredel(yanke-yankb);
  1477. X    cc = strlen(kring[kct]);
  1478. X    spaceinline(cc);
  1479. X    strncpy(line+cs,kring[kct],cc);
  1480. X    cs += cc;
  1481. X    yanke = cs;
  1482. X    kct = (kct-1) & (KRINGCT-1);
  1483. X}
  1484. X
  1485. Xvoid overwritemode() /**/
  1486. X{
  1487. X    insmode ^= 1;
  1488. X}
  1489. X
  1490. Xvoid undefinedkey() /**/
  1491. X{
  1492. X    feep();
  1493. X}
  1494. X
  1495. Xvoid quotedinsert() /**/
  1496. X{
  1497. X    if (c = getkey(0))
  1498. X        selfinsert();
  1499. X    else
  1500. X        feep();
  1501. X}
  1502. X
  1503. Xvoid digitargument() /**/
  1504. X{
  1505. X    if (!(lastcmd & ZLE_ARG))
  1506. X        mult = 0;
  1507. X    mult = mult*10+(c&0xf);
  1508. X    if (lastcmd & ZLE_NEGARG) mult = -mult;
  1509. X}
  1510. X
  1511. Xvoid negargument() /**/
  1512. X{
  1513. X    if (lastcmd & ZLE_ARG) feep();
  1514. X}
  1515. X
  1516. Xvoid universalargument() /**/
  1517. X{
  1518. X    if (!(lastcmd & ZLE_ARG))
  1519. X        mult = 4;
  1520. X    else
  1521. X        mult *= 4;
  1522. X}
  1523. X
  1524. Xvoid copyprevword() /**/
  1525. X{
  1526. Xint len,t0;
  1527. X
  1528. X    for (t0 = cs-1; t0 >= 0; t0--)
  1529. X        if (iword(line[t0]))
  1530. X            break;
  1531. X    for (; t0 >= 0; t0--)
  1532. X        if (!iword(line[t0]))
  1533. X            break;
  1534. X    if (t0)
  1535. X        t0++;
  1536. X    len = cs-t0;
  1537. X    spaceinline(len);
  1538. X    strncpy(line+cs,line+t0,len);
  1539. X    cs += len;
  1540. X}
  1541. X
  1542. Xvoid sendbreak() /**/
  1543. X{
  1544. X    errflag = done = 1;
  1545. X}
  1546. X
  1547. Xvoid undo() /**/
  1548. X{
  1549. Xchar *s;
  1550. Xstruct undoent *ue;
  1551. X
  1552. X    ue = undos+undoct;
  1553. X    if (!ue->change)
  1554. X        {
  1555. X        feep();
  1556. X        return;
  1557. X        }
  1558. X    line[ll] = '\0';
  1559. X    s = ztrdup(line+ll-ue->suff);
  1560. X    sizeline((ll = ue->pref+ue->suff+ue->len)+1);
  1561. X    strncpy(line+ue->pref,ue->change,ue->len);
  1562. X    strcpy(line+ue->pref+ue->len,s);
  1563. X    free(s);
  1564. X    ue->change = NULL;
  1565. X    undoct = (undoct-1) & (UNDOCT-1);
  1566. X    cs = ue->cs;
  1567. X}
  1568. X
  1569. Xvoid quoteregion() /**/
  1570. X{
  1571. Xchar *s,*t;
  1572. Xint x,y;
  1573. X
  1574. X    if (mark > ll)
  1575. X        mark = ll;
  1576. X    if (mark < cs)
  1577. X        {
  1578. X        x = mark;
  1579. X        mark = cs;
  1580. X        cs = x;
  1581. X        }
  1582. X    s = hcalloc((y = mark-cs)+1);
  1583. X    strncpy(s,line+cs,y);
  1584. X    s[y] = '\0';
  1585. X    foredel(mark-cs);
  1586. X    t = makequote(s);
  1587. X    spaceinline(x = strlen(t));
  1588. X    strncpy(line+cs,t,x);
  1589. X    mark = cs;
  1590. X    cs += x;
  1591. X}
  1592. X
  1593. Xvoid quoteline() /**/
  1594. X{
  1595. Xchar *s;
  1596. X
  1597. X    line[ll] = '\0';
  1598. X    s = makequote(line);
  1599. X    setline(s);
  1600. X}
  1601. X
  1602. Xchar *makequote(s) /**/
  1603. Xchar *s;
  1604. X{
  1605. Xint qtct = 0;
  1606. Xchar *l,*ol;
  1607. X
  1608. X    for (l = s; *l; l++)
  1609. X        if (*l == '\'')
  1610. X            qtct++;
  1611. X    l = ol = halloc((qtct*3)+3+strlen(s));
  1612. X    *l++ = '\'';
  1613. X    for (; *s; s++)
  1614. X        if (*s == '\'')
  1615. X            {
  1616. X            *l++ = '\'';
  1617. X            *l++ = '\\';
  1618. X            *l++ = '\'';
  1619. X            *l++ = '\'';
  1620. X            }
  1621. X        else
  1622. X            *l++ = *s;
  1623. X    *l++ = '\'';
  1624. X    *l = '\0';
  1625. X    return ol;
  1626. X}
  1627. X
  1628. X#define NAMLEN 70
  1629. X
  1630. Xint executenamedcommand() /**/
  1631. X{
  1632. Xchar buf[NAMLEN],*ptr;
  1633. Xint len,ch,t0;
  1634. X
  1635. X    strcpy(buf,"execute: ");
  1636. X    ptr = buf+9;
  1637. X    len = 0;
  1638. X    statusline = buf;
  1639. X    refresh();
  1640. X    for (;ch = getkey(1);refresh())
  1641. X        {
  1642. X        switch (ch)
  1643. X            {
  1644. X            case 8: case 127:
  1645. X                if (len)
  1646. X                    {
  1647. X                    len--;
  1648. X                    *--ptr = '\0';
  1649. X                    }
  1650. X                break;
  1651. X            case 23:
  1652. X                while (len && (len--, *--ptr != '-'))
  1653. X                    *ptr = '\0';
  1654. X                break;
  1655. X            case 21:
  1656. X                len = 0;
  1657. X                ptr = buf+9;
  1658. X                *ptr = '\0';
  1659. X                break;
  1660. X            case 10: case 13: goto brk;
  1661. X            case 7: case -1: statusline = NULL; return z_undefinedkey;
  1662. X            case 9: case 32:
  1663. X                {
  1664. X                Lklist ll;
  1665. X                int ambig = 100;
  1666. X
  1667. X                heapalloc();
  1668. X                ll = newlist();
  1669. X                for (t0 = 0; t0 != ZLECMDCOUNT; t0++)
  1670. X                    if (strpfx(buf+9,zlecmds[t0].name))
  1671. X                        {
  1672. X                        int xx;
  1673. X
  1674. X                        addnode(ll,zlecmds[t0].name);
  1675. X                        xx = pfxlen(peekfirst(ll),zlecmds[t0].name);
  1676. X                        if (xx < ambig)
  1677. X                            ambig = xx;
  1678. X                        }
  1679. X                permalloc();
  1680. X                if (!full(ll))
  1681. X                    feep();
  1682. X                else if (!nextnode(firstnode(ll)))
  1683. X                    {
  1684. X                    strcpy(buf+9,peekfirst(ll));
  1685. X                    ptr = buf+(len = strlen(buf));
  1686. X                    }
  1687. X                else
  1688. X                    {
  1689. X                    strcpy(buf+9,peekfirst(ll));
  1690. X                    len = ambig;
  1691. X                    ptr = buf+9+len;
  1692. X                    *ptr = '\0';
  1693. X                    feep();
  1694. X                    listmatches(ll,NULL);
  1695. X                    }
  1696. X                break;
  1697. X                }
  1698. X            default:
  1699. X                if (len == NAMLEN-10 || icntrl(ch))
  1700. X                    feep();
  1701. X                else
  1702. X                    *ptr++ = ch, *ptr = '\0', len++;
  1703. X                break;
  1704. X            }
  1705. X        }
  1706. Xbrk:
  1707. X    statusline = NULL;
  1708. X    ptr = buf+9;
  1709. X    for (t0 = 0; t0 != ZLECMDCOUNT; t0++)
  1710. X        if (!strcmp(ptr,zlecmds[t0].name))
  1711. X            break;
  1712. X    if (t0 != ZLECMDCOUNT)
  1713. X        return lastnamed = t0;
  1714. X    else
  1715. X        return z_undefinedkey;
  1716. X}
  1717. X
  1718. Xvoid vijoin() /**/
  1719. X{
  1720. Xint x;
  1721. X
  1722. X    if ((x = findeol()) == ll)
  1723. X        {
  1724. X        feep();
  1725. X        return;
  1726. X        }
  1727. X    cs = x+1;
  1728. X    for (x = 1; cs != ll && iblank(line[cs]); cs++,x++);
  1729. X    backdel(x);
  1730. X    spaceinline(1);
  1731. X    line[cs] = ' ';
  1732. X}
  1733. X
  1734. Xvoid viswapcase() /**/
  1735. X{
  1736. X    if (cs < ll)
  1737. X        {
  1738. X        int ch = line[cs];
  1739. X
  1740. X        if (ch >= 'a' && ch <= 'z')
  1741. X            ch = tuupper(ch);
  1742. X        else if (ch >= 'A' && ch <= 'Z')
  1743. X            ch = tulower(ch);
  1744. X        line[cs++] = ch;
  1745. X        }
  1746. X}
  1747. X
  1748. Xvoid vicapslockpanic() /**/
  1749. X{
  1750. Xchar ch;
  1751. X
  1752. X    statusline = "press a lowercase key to continue";
  1753. X    refresh();
  1754. X    do
  1755. X        ch = getkey(0);
  1756. X    while (!(ch >= 'a' && ch <= 'z'));
  1757. X}
  1758. X
  1759. Xvoid visetbuffer() /**/
  1760. X{
  1761. Xint ch;
  1762. X
  1763. X    ch = getkey(1);
  1764. X    if (!ialnum(ch)) {
  1765. X        feep();
  1766. X        return;
  1767. X    }
  1768. X    vibufspec = ch;
  1769. X}
  1770. SHAR_EOF
  1771. chmod 0644 zsh2.1/src/zle_misc.c ||
  1772. echo 'restore of zsh2.1/src/zle_misc.c failed'
  1773. Wc_c="`wc -c < 'zsh2.1/src/zle_misc.c'`"
  1774. test 9823 -eq "$Wc_c" ||
  1775.     echo 'zsh2.1/src/zle_misc.c: original size 9823, current size' "$Wc_c"
  1776. rm -f _shar_wnt_.tmp
  1777. fi
  1778. # ============= zsh2.1/src/zle_word.c ==============
  1779. if test -f 'zsh2.1/src/zle_word.c' -a X"$1" != X"-c"; then
  1780.     echo 'x - skipping zsh2.1/src/zle_word.c (File already exists)'
  1781.     rm -f _shar_wnt_.tmp
  1782. else
  1783. > _shar_wnt_.tmp
  1784. echo 'x - extracting zsh2.1/src/zle_word.c (Text)'
  1785. sed 's/^X//' << 'SHAR_EOF' > 'zsh2.1/src/zle_word.c' &&
  1786. X/*
  1787. X
  1788. X    zle_word.c - word-related editor functions
  1789. X
  1790. X    This file is part of zsh, the Z shell.
  1791. X
  1792. X    zsh is free software; no one can prevent you from reading the source
  1793. X   code, or giving it to someone else.
  1794. X
  1795. X   This file is copyrighted under the GNU General Public License, which
  1796. X   can be found in the file called COPYING.
  1797. X
  1798. X   Copyright (C) 1990, 1991 Paul Falstad
  1799. X
  1800. X   zsh is distributed in the hope that it will be useful, but
  1801. X   WITHOUT ANY WARRANTY.  No author or distributor accepts
  1802. X   responsibility to anyone for the consequences of using it or for
  1803. X   whether it serves any particular purpose or works at all, unless he
  1804. X   says so in writing.  Refer to the GNU General Public License
  1805. X   for full details.
  1806. X
  1807. X   Everyone is granted permission to copy, modify and redistribute
  1808. X   zsh, but only under the conditions described in the GNU General Public
  1809. X   License.   A copy of this license is supposed to have been given to you
  1810. X   along with zsh so you can know your rights and responsibilities.
  1811. X   It should be in a file named COPYING.
  1812. X
  1813. X   Among other things, the copyright notice and this notice must be
  1814. X   preserved on all copies.
  1815. X
  1816. X*/
  1817. X
  1818. X#define ZLE
  1819. X#include "zsh.h"
  1820. X
  1821. X
  1822. Xvoid forwardword() /**/
  1823. X{
  1824. X    if (mult < 0) { mult = -mult; backwardword(); return; }
  1825. X    while (mult--) {
  1826. X        while (cs != ll && iword(line[cs])) cs++;
  1827. X        while (cs != ll && !iword(line[cs])) cs++;
  1828. X    }
  1829. X}
  1830. X
  1831. Xvoid viforwardblankword() /**/
  1832. X{
  1833. X    if (mult < 0) { mult = -mult; vibackwardblankword(); return; }
  1834. X    while (mult--) {
  1835. X        while (cs != ll && !iblank(line[cs])) cs++;
  1836. X        while (cs != ll && iblank(line[cs])) cs++;
  1837. X    }
  1838. X}
  1839. X
  1840. Xvoid emacsforwardword() /**/
  1841. X{
  1842. X    if (mult < 0) { mult = -mult; emacsbackwardword(); return; }
  1843. X    while (mult--)
  1844. X        {
  1845. X        while (cs != ll && !iword(line[cs])) cs++;
  1846. X        while (cs != ll && iword(line[cs])) cs++;
  1847. X        }
  1848. X}
  1849. X
  1850. Xvoid viforwardblankwordend() /**/
  1851. X{
  1852. X    if (mult < 0) return;
  1853. X    while (mult--) {
  1854. X        while (cs != ll && iblank(line[cs+1])) cs++;
  1855. X        while (cs != ll && !iblank(line[cs+1])) cs++;
  1856. X    }
  1857. X}
  1858. X
  1859. Xvoid viforwardwordend() /**/
  1860. X{
  1861. X    if (mult < 0) return;
  1862. X    while (mult--) {
  1863. X        while (cs != ll && !iword(line[cs+1])) cs++;
  1864. X        while (cs != ll && iword(line[cs+1])) cs++;
  1865. X    }
  1866. X}
  1867. X
  1868. Xvoid backwardword() /**/
  1869. X{
  1870. X    if (mult < 0) { mult = -mult; forwardword(); return; }
  1871. X    while (mult--) {
  1872. X        while (cs && !iword(line[cs-1])) cs--;
  1873. X        while (cs && iword(line[cs-1])) cs--;
  1874. X    }
  1875. X}
  1876. X
  1877. Xvoid vibackwardblankword() /**/
  1878. X{
  1879. X    if (mult < 0) { mult = -mult; viforwardblankword(); return; }
  1880. X    while (mult--) {
  1881. X        while (cs && iblank(line[cs-1])) cs--;
  1882. X        while (cs && !iblank(line[cs-1])) cs--;
  1883. X    }
  1884. X}
  1885. X
  1886. Xvoid emacsbackwardword() /**/
  1887. X{
  1888. X    if (mult < 0) { mult = -mult; emacsforwardword(); return; }
  1889. X    while (mult--) {
  1890. X        while (cs && !iword(line[cs-1])) cs--;
  1891. X        while (cs && iword(line[cs-1])) cs--;
  1892. X    }
  1893. X}
  1894. X
  1895. Xvoid backwarddeleteword() /**/
  1896. X{
  1897. Xint x = cs;
  1898. X
  1899. X    if (mult < 0) { mult = -mult; deleteword(); return; }
  1900. X    while (mult--) {
  1901. X        while (x && !iword(line[x-1])) x--;
  1902. X        while (x && iword(line[x-1])) x--;
  1903. X    }
  1904. X    backdel(cs-x);
  1905. X}
  1906. X
  1907. Xvoid vibackwardkillword() /**/
  1908. X{
  1909. Xint x = cs;
  1910. X
  1911. X    if (mult < 0) { feep(); return; }
  1912. X    while (mult--) {
  1913. X        while (x > viinsbegin && !iword(line[x-1])) x--;
  1914. X        while (x > viinsbegin && iword(line[x-1])) x--;
  1915. X    }
  1916. X    backkill(cs-x,1);
  1917. X}
  1918. X
  1919. Xvoid backwardkillword() /**/
  1920. X{
  1921. Xint x = cs;
  1922. X
  1923. X    if (mult < 0) { mult = -mult; killword(); return; }
  1924. X    while (mult--) {
  1925. X        while (x && !iword(line[x-1])) x--;
  1926. X        while (x && iword(line[x-1])) x--;
  1927. X    }
  1928. X    backkill(cs-x,1);
  1929. X}
  1930. X
  1931. Xvoid upcaseword() /**/
  1932. X{
  1933. Xint neg = mult < 0, ocs = cs;
  1934. X
  1935. X    if (neg) mult = -mult;
  1936. X    while (mult--) {
  1937. X        while (cs != ll && !iword(line[cs])) cs++;
  1938. X        while (cs != ll && iword(line[cs])) {
  1939. X            line[cs] = tuupper(line[cs]);
  1940. X            cs++;
  1941. X        }
  1942. X    }
  1943. X    if (neg) cs = ocs;
  1944. X}
  1945. X
  1946. Xvoid downcaseword() /**/
  1947. X{
  1948. Xint neg = mult < 0, ocs = cs;
  1949. X
  1950. X    if (neg) mult = -mult;
  1951. X    while (mult--) {
  1952. X        while (cs != ll && !iword(line[cs])) cs++;
  1953. X        while (cs != ll && iword(line[cs])) {
  1954. X            line[cs] = tulower(line[cs]);
  1955. X            cs++;
  1956. X        }
  1957. X    }
  1958. X    if (neg) cs = ocs;
  1959. X}
  1960. X
  1961. Xvoid capitalizeword() /**/
  1962. X{
  1963. Xint first;
  1964. Xint neg = mult < 0, ocs = cs;
  1965. X    
  1966. X    if (neg) mult = -mult;
  1967. X    while (mult--) {
  1968. X        first = 1;
  1969. X        while (cs != ll && !iword(line[cs])) cs++;
  1970. X        while (cs != ll && iword(line[cs])) {
  1971. X            line[cs] = (first) ? tuupper(line[cs]) : tulower(line[cs]);
  1972. X            first = 0;
  1973. X            cs++;
  1974. X        }
  1975. X    }
  1976. X    if (neg) cs = ocs;
  1977. X}
  1978. X
  1979. Xvoid deleteword() /**/
  1980. X{
  1981. Xint x = cs;
  1982. X
  1983. X    if (mult < 0) { mult = -mult; backwarddeleteword(); return; }
  1984. X    while (mult--) {
  1985. X        while (x != ll && !iword(line[x])) x++;
  1986. X        while (x != ll && iword(line[x])) x++;
  1987. X    }
  1988. X    foredel(x-cs);
  1989. X}
  1990. X
  1991. Xvoid killword() /**/
  1992. X{
  1993. Xint x = cs;
  1994. X
  1995. X    if (mult < 0) { mult = -mult; backwardkillword(); return; }
  1996. X    while (mult--) {
  1997. X        while (x != ll && !iword(line[x])) x++;
  1998. X        while (x != ll && iword(line[x])) x++;
  1999. X    }
  2000. X    forekill(x-cs,0);
  2001. X}
  2002. X
  2003. Xvoid transposewords() /**/
  2004. X{
  2005. Xint p1,p2,p3,p4,x = cs;
  2006. Xchar *temp,*pp;
  2007. Xint neg = mult < 0, ocs = cs;
  2008. X
  2009. X    if (neg) mult = -mult;
  2010. X    while (mult--) {
  2011. X        while (x != ll && line[x] != '\n' && !iword(line[x]))
  2012. X            x++;
  2013. X        if (x == ll || line[x] == '\n') {
  2014. X            x = cs;
  2015. X            while (x && line[x-1] != '\n' && !iword(line[x]))
  2016. X                x--;
  2017. X            if (!x || line[x-1] == '\n') {
  2018. X                feep();
  2019. X                return;
  2020. X            }
  2021. X        }
  2022. X        for (p4 = x; p4 != ll && iword(line[p4]); p4++);
  2023. X        for (p3 = p4; p3 && iword(line[p3-1]); p3--);
  2024. X        if (!p3) {
  2025. X            feep();
  2026. X            return;
  2027. X        }
  2028. X        for (p2 = p3; p2 && !iword(line[p2-1]); p2--);
  2029. X        if (!p2) {
  2030. X            feep();
  2031. X            return;
  2032. X        }
  2033. X        for (p1 = p2; p1 && iword(line[p1-1]); p1--);
  2034. X        pp = temp = halloc(p4-p1+1);
  2035. X        struncpy(&pp,line+p3,p4-p3);
  2036. X        struncpy(&pp,line+p2,p3-p2);
  2037. X        struncpy(&pp,line+p1,p2-p1);
  2038. X        strncpy(line+p1,temp,p4-p1);
  2039. X        cs = p4;
  2040. X    }
  2041. X    if (neg) cs = ocs;
  2042. X}
  2043. SHAR_EOF
  2044. chmod 0644 zsh2.1/src/zle_word.c ||
  2045. echo 'restore of zsh2.1/src/zle_word.c failed'
  2046. Wc_c="`wc -c < 'zsh2.1/src/zle_word.c'`"
  2047. test 5509 -eq "$Wc_c" ||
  2048.     echo 'zsh2.1/src/zle_word.c: original size 5509, current size' "$Wc_c"
  2049. rm -f _shar_wnt_.tmp
  2050. fi
  2051. # ============= zsh2.1/src/zle_hist.c ==============
  2052. if test -f 'zsh2.1/src/zle_hist.c' -a X"$1" != X"-c"; then
  2053.     echo 'x - skipping zsh2.1/src/zle_hist.c (File already exists)'
  2054.     rm -f _shar_wnt_.tmp
  2055. else
  2056. > _shar_wnt_.tmp
  2057. echo 'x - extracting zsh2.1/src/zle_hist.c (Text)'
  2058. sed 's/^X//' << 'SHAR_EOF' > 'zsh2.1/src/zle_hist.c' &&
  2059. X/*
  2060. X
  2061. X    zle_hist.c - history editing
  2062. X
  2063. X    This file is part of zsh, the Z shell.
  2064. X
  2065. X    zsh is free software; no one can prevent you from reading the source
  2066. X   code, or giving it to someone else.
  2067. X
  2068. X   This file is copyrighted under the GNU General Public License, which
  2069. X   can be found in the file called COPYING.
  2070. X
  2071. X   Copyright (C) 1990, 1991 Paul Falstad
  2072. X
  2073. X   zsh is distributed in the hope that it will be useful, but
  2074. X   WITHOUT ANY WARRANTY.  No author or distributor accepts
  2075. X   responsibility to anyone for the consequences of using it or for
  2076. X   whether it serves any particular purpose or works at all, unless he
  2077. X   says so in writing.  Refer to the GNU General Public License
  2078. X   for full details.
  2079. X
  2080. X   Everyone is granted permission to copy, modify and redistribute
  2081. X   zsh, but only under the conditions described in the GNU General Public
  2082. X   License.   A copy of this license is supposed to have been given to you
  2083. X   along with zsh so you can know your rights and responsibilities.
  2084. X   It should be in a file named COPYING.
  2085. X
  2086. X   Among other things, the copyright notice and this notice must be
  2087. X   preserved on all copies.
  2088. X
  2089. X*/
  2090. X
  2091. X#define ZLE
  2092. X#include "zsh.h"
  2093. X
  2094. Xvoid toggleliteralhistory() /**/
  2095. X{
  2096. Xchar *s;
  2097. X
  2098. X    if (histline == curhist)
  2099. X        {
  2100. X        if (curhistline)
  2101. X            free(curhistline);
  2102. X        curhistline = ztrdup(line);
  2103. X        }
  2104. X    lithist ^= 1;
  2105. X    if (!(s = qgetevent(histline)))
  2106. X        feep();
  2107. X    else
  2108. X        sethistline(s);
  2109. X}
  2110. X
  2111. Xvoid uphistory() /**/
  2112. X{
  2113. Xchar *s;
  2114. X
  2115. X    if (mult < 0) { mult = -mult; downhistory(); return; }
  2116. X    if (histline == curhist)
  2117. X        {
  2118. X        if (curhistline)
  2119. X            free(curhistline);
  2120. X        curhistline = ztrdup(line);
  2121. X        }
  2122. X    histline -= mult;
  2123. X    if (!(s = qgetevent(histline)))
  2124. X        {
  2125. X        feep();
  2126. X        histline += mult;
  2127. X        }
  2128. X    else
  2129. X        sethistline(s);
  2130. X}
  2131. X
  2132. Xvoid uplineorhistory() /**/
  2133. X{
  2134. Xint ocs = cs;
  2135. X
  2136. X    if (mult < 0) { mult = -mult; downlineorhistory(); return; }
  2137. X    if ((lastcmd & ZLE_LINEMOVE) != ZLE_LINEMOVE)
  2138. X        lastcol = cs-findbol();
  2139. X    cs = findbol();
  2140. X    while (mult) {
  2141. X        if (!cs)
  2142. X            break;
  2143. X        cs--;
  2144. X        cs = findbol();
  2145. X        mult--;
  2146. X    }
  2147. X    if (mult) {
  2148. X        cs = ocs;
  2149. X        if (virangeflag) {
  2150. X            feep();
  2151. X            return;
  2152. X        }
  2153. X        uphistory();
  2154. X    } else {
  2155. X        int x = findeol();
  2156. X        if ((cs += lastcol) > x)
  2157. X            cs = x;
  2158. X    }
  2159. X}
  2160. X
  2161. Xvoid downlineorhistory() /**/
  2162. X{
  2163. Xint ocs = cs;
  2164. X
  2165. X    if (mult < 0) { mult = -mult; uplineorhistory(); return; }
  2166. X    if ((lastcmd & ZLE_LINEMOVE) != ZLE_LINEMOVE)
  2167. X        lastcol = cs-findbol();
  2168. X    while (mult) {
  2169. X        int x = findeol();
  2170. X        if (x == ll)
  2171. X            break;
  2172. X        cs = x+1;
  2173. X        mult--;
  2174. X    }
  2175. X    if (mult) {
  2176. X        cs = ocs;
  2177. X        if (virangeflag) {
  2178. X            feep();
  2179. X            return;
  2180. X        }
  2181. X        downhistory();
  2182. X    } else {
  2183. X        int x = findeol();
  2184. X        if ((cs += lastcol) > x)
  2185. X            cs = x;
  2186. X    }
  2187. X}
  2188. X
  2189. Xvoid acceptlineanddownhistory() /**/
  2190. X{
  2191. Xchar *s,*t;
  2192. X
  2193. X    if (!(s = qgetevent(histline+1)))
  2194. X        {
  2195. X        feep();
  2196. X        return;
  2197. X        }
  2198. X    pushnode(bufstack,t = ztrdup(s));
  2199. X    for (; *t; t++)
  2200. X        if (*t == HISTSPACE)
  2201. X            *t = ' ';
  2202. X    done = 1;
  2203. X    stackhist = histline+1;
  2204. X}
  2205. X
  2206. Xvoid downhistory() /**/
  2207. X{
  2208. Xchar *s;
  2209. X
  2210. X    if (mult < 0) { mult = -mult; uphistory(); return; }
  2211. X    histline += mult;
  2212. X    if (!(s = qgetevent(histline)))
  2213. X        {
  2214. X        feep();
  2215. X        histline -= mult;
  2216. X        return;
  2217. X        }
  2218. X    sethistline(s);
  2219. X}
  2220. X
  2221. Xstatic int histpos;
  2222. X
  2223. Xvoid historysearchbackward() /**/
  2224. X{
  2225. Xint t0,ohistline = histline;
  2226. Xchar *s;
  2227. X
  2228. X    if (histline == curhist)
  2229. X        {
  2230. X        if (curhistline)
  2231. X            free(curhistline);
  2232. X        curhistline = ztrdup(line);
  2233. X        }
  2234. X    if (lastcmd & ZLE_HISTSEARCH) t0 = histpos;
  2235. X    else for (t0 = 0; line[t0] && iword(line[t0]); t0++);
  2236. X    histpos = t0;
  2237. X    for (;;)
  2238. X        {
  2239. X        histline--;
  2240. X        if (!(s = qgetevent(histline)))
  2241. X            {
  2242. X            feep();
  2243. X            histline = ohistline;
  2244. X            return;
  2245. X            }
  2246. X        if (!hstrncmp(s,line,t0) && hstrcmp(s,line))
  2247. X            break;
  2248. X        }
  2249. X    sethistline(s);
  2250. X}
  2251. X
  2252. Xvoid historysearchforward() /**/
  2253. X{
  2254. Xint t0,ohistline = histline;
  2255. Xchar *s;
  2256. X
  2257. X    if (histline == curhist)
  2258. X        {
  2259. X        if (curhistline)
  2260. X            free(curhistline);
  2261. X        curhistline = ztrdup(line);
  2262. X        }
  2263. X    if (lastcmd & ZLE_HISTSEARCH) t0 = histpos;
  2264. X    else for (t0 = 0; line[t0] && iword(line[t0]); t0++);
  2265. X    histpos = t0;
  2266. X    for (;;)
  2267. X        {
  2268. X        histline++;
  2269. X        if (!(s = qgetevent(histline)))
  2270. X            {
  2271. X            feep();
  2272. X            histline = ohistline;
  2273. X            return;
  2274. X            }
  2275. X        if (!hstrncmp(s,line,t0) && hstrcmp(s,line))
  2276. X            break;
  2277. X        }
  2278. X    sethistline(s);
  2279. X}
  2280. X
  2281. Xvoid beginningofbufferorhistory() /**/
  2282. X{
  2283. X    if (findbol())
  2284. X        cs = 0;
  2285. X    else
  2286. X        beginningofhistory();
  2287. X}
  2288. X
  2289. Xvoid beginningofhistory() /**/
  2290. X{
  2291. Xchar *s;
  2292. X
  2293. X    if (histline == curhist)
  2294. X        {
  2295. X        if (curhistline)
  2296. X            free(curhistline);
  2297. X        curhistline = ztrdup(line);
  2298. X        }
  2299. X    if (!(s = qgetevent(firsthist)))
  2300. X        {
  2301. X        feep();
  2302. X        return;
  2303. X        }
  2304. X    histline = firsthist;
  2305. X    sethistline(s);
  2306. X}
  2307. X
  2308. Xvoid endofbufferorhistory() /**/
  2309. X{
  2310. X    if (findeol() != ll)
  2311. X        cs = ll;
  2312. X    else
  2313. X        endofhistory();
  2314. X}
  2315. X
  2316. Xvoid endofhistory() /**/
  2317. X{
  2318. X    if (histline == curhist)
  2319. X        feep();
  2320. X    else
  2321. X        {
  2322. X        histline = curhist;
  2323. X        sethistline(curhistline);
  2324. X        }
  2325. X}
  2326. X
  2327. Xvoid insertlastword() /**/
  2328. X{
  2329. Xchar *s,*t;
  2330. Xint len,z = lithist;
  2331. X
  2332. X    /* multiple calls will now search back through the history, pem */
  2333. X    static char    *lastinsert;
  2334. X    static int    lasthist, lastpos;
  2335. X    int        evhist = curhist - 1;
  2336. X
  2337. X    if (lastinsert) {
  2338. X        int len = strlen(lastinsert);
  2339. X        int pos = cs;
  2340. X        if (    lastpos <= pos &&
  2341. X            len == pos - lastpos &&
  2342. X            strncmp(lastinsert, &line[lastpos], len) == 0) {
  2343. X        evhist = --lasthist;
  2344. X        cs = lastpos;
  2345. X        foredel(pos-cs);
  2346. X        }
  2347. X        free(lastinsert);
  2348. X        lastinsert = NULL;
  2349. X    }
  2350. X    lithist = 0;
  2351. X    if (!(s = qgetevent(evhist), lithist = z, s))
  2352. X        {
  2353. X        feep();
  2354. X        return;
  2355. X        }
  2356. X    for (t = s+strlen(s); t > s; t--)
  2357. X        if (*t == HISTSPACE)
  2358. X            break;
  2359. X    if (t != s)
  2360. X        t++;
  2361. X    lasthist = evhist;
  2362. X    lastpos = cs;
  2363. X    lastinsert = ztrdup(t);
  2364. X    spaceinline(len = strlen(t));
  2365. X    strncpy(line+cs,t,len);
  2366. X    cs += len;
  2367. X}
  2368. X
  2369. Xchar *qgetevent(ev) /**/
  2370. Xint ev;
  2371. X{
  2372. X    if (ev > curhist)
  2373. X        return NULL;
  2374. X    return ((ev == curhist) ? curhistline : quietgetevent(ev));
  2375. X}
  2376. X
  2377. Xvoid pushline() /**/
  2378. X{
  2379. X    if (mult < 0) return;
  2380. X    pushnode(bufstack,ztrdup(line));
  2381. X    while (--mult)
  2382. X        pushnode(bufstack,ztrdup(""));
  2383. X    stackcs = cs;
  2384. X    *line = '\0';
  2385. X    ll = cs = 0;
  2386. X}
  2387. X
  2388. Xvoid getline() /**/
  2389. X{
  2390. Xchar *s = getnode(bufstack);
  2391. X
  2392. X    if (!s)
  2393. X        feep();
  2394. X    else
  2395. X        {
  2396. X        int cc;
  2397. X
  2398. X        cc = strlen(s);
  2399. X        spaceinline(cc);
  2400. X        strncpy(line+cs,s,cc);
  2401. X        cs += cc;
  2402. X        free(s);
  2403. X        }
  2404. X}
  2405. X
  2406. Xvoid historyincrementalsearchbackward() /**/
  2407. X{
  2408. X    doisearch(-1);
  2409. X}
  2410. X
  2411. Xvoid historyincrementalsearchforward() /**/
  2412. X{
  2413. X    doisearch(1);
  2414. X}
  2415. X
  2416. Xvoid doisearch(dir) /**/
  2417. Xint dir;
  2418. X{
  2419. Xchar *s,*oldl;
  2420. Xchar ibuf[256],*sbuf = ibuf+10;
  2421. Xint sbptr = 0,ch,ohl = histline,ocs = cs;
  2422. Xint nomatch = 0,chequiv = 0;
  2423. X
  2424. X    strcpy(ibuf,"i-search: ");
  2425. X    statusline = ibuf;
  2426. X    oldl = ztrdup(line);
  2427. X    if (histline == curhist)
  2428. X        {
  2429. X        if (curhistline)
  2430. X            free(curhistline);
  2431. X        curhistline = ztrdup(line);
  2432. X        }
  2433. X    for (;;)
  2434. X        {
  2435. X        nomatch = 0;
  2436. X        if (sbptr > 1 || (sbptr == 1 && sbuf[0] != '^'))
  2437. X            {
  2438. X            int ohistline = histline;
  2439. X
  2440. X            for (;;)
  2441. X                {
  2442. X                char *t;
  2443. X
  2444. X                if (!(s = qgetevent(histline)))
  2445. X                    {
  2446. X                    feep();
  2447. X                    nomatch = 1;
  2448. X                    histline = ohistline;
  2449. X                    break;
  2450. X                    }
  2451. X                if ((sbuf[0] == '^') ?
  2452. X                        (t = (hstrncmp(s,sbuf+1,sbptr-1)) ? NULL : s) :
  2453. X                        (t = hstrnstr(s,sbuf,sbptr)))
  2454. X                    if (!(chequiv && !hstrcmp(line,s)))
  2455. X                        {
  2456. X                        sethistline(s);
  2457. X                        cs = t-s+sbptr-(sbuf[0] == '^');
  2458. X                        break;
  2459. X                        }
  2460. X                histline += dir;
  2461. X                }
  2462. X            chequiv = 0;
  2463. X            }
  2464. X        refresh();
  2465. X        if ((ch = getkey(1)) == -1)
  2466. X            break;
  2467. X        if (ch == 22 || ch == 17) {
  2468. X            if ((ch = getkey(1)) == -1)
  2469. X                break;
  2470. X        } else if (ch == 8 || ch == 127) {
  2471. X            if (sbptr)
  2472. X                sbuf[--sbptr] = '\0';
  2473. X            else
  2474. X                feep();
  2475. X            histline = ohl;
  2476. X            continue;
  2477. X        } else if (ch == 7 || ch == 3) {
  2478. X            setline(oldl);
  2479. X            cs = ocs;
  2480. X            histline = ohl;
  2481. X            statusline = NULL;
  2482. X            break;
  2483. X        } else if (ch == 27)
  2484. X            break;
  2485. X        else if (ch == 10 || ch == 13) {
  2486. X            ungetkey(ch);
  2487. X            break;
  2488. X        } else if (ch == 18) {
  2489. X            ohl = (histline += (dir = -1));
  2490. X            chequiv = 1;
  2491. X            continue;
  2492. X        } else if (ch == 19) {
  2493. X            ohl = (histline += (dir = 1));
  2494. X            chequiv = 1;
  2495. X            continue;
  2496. X        } else if (!(ch & 0x60)) {
  2497. X            ungetkey(ch);
  2498. X            break;
  2499. X        }
  2500. X        if (!nomatch && sbptr != 39 && !icntrl(ch)) {
  2501. X            sbuf[sbptr++] = ch;
  2502. X            sbuf[sbptr] = '\0';
  2503. X        }
  2504. X    }
  2505. X    free(oldl);
  2506. X    statusline = NULL;
  2507. X}
  2508. X
  2509. Xvoid acceptandinfernexthistory() /**/
  2510. SHAR_EOF
  2511. true || echo 'restore of zsh2.1/src/zle_hist.c failed'
  2512. fi
  2513. echo 'End of zsh2.1.0 part 15'
  2514. echo 'File zsh2.1/src/zle_hist.c is continued in part 16'
  2515. echo 16 > _shar_seq_.tmp
  2516. exit 0
  2517.  
  2518. exit 0 # Just in case...
  2519. -- 
  2520. Kent Landfield                   INTERNET: kent@sparky.IMD.Sterling.COM
  2521. Sterling Software, IMD           UUCP:     uunet!sparky!kent
  2522. Phone:    (402) 291-8300         FAX:      (402) 291-4362
  2523. Please send comp.sources.misc-related mail to kent@uunet.uu.net.
  2524.