home *** CD-ROM | disk | FTP | other *** search
/ Source Code 1992 March / Source_Code_CD-ROM_Walnut_Creek_March_1992.iso / usenet / compsrcs / unix / volume18 / ctrl < prev    next >
Encoding:
Text File  |  1989-04-21  |  6.5 KB  |  373 lines

  1. Path: wugate!wucs1!uunet!bbn.com!rsalz
  2. From: rsalz@uunet.uu.net (Rich Salz)
  3. Newsgroups: comp.sources.unix
  4. Subject: v18i110:  Transform symbolic to real escape sequences
  5. Message-ID: <1688@papaya.bbn.com>
  6. Date: 20 Apr 89 15:19:02 GMT
  7. Lines: 363
  8. Approved: rsalz@uunet.UU.NET
  9.  
  10. Submitted-by: Maarten Litmaath <maart@cs.vu.nl>
  11. Posting-number: Volume 18, Issue 110
  12. Archive-name: ctrl
  13.  
  14. with this little utility a lot of annoyance can be avoided.  For example
  15.     unesc '^[[7m\fIStandout mode on a Sun console\fR.'
  16. is equivalent to
  17.     echo "`esc`[7m\fIStandout mode on a Sun console\fR."
  18.  
  19. Regards,
  20.                     Maarten Litmaath @ VU Amsterdam:
  21.                     maart@cs.vu.nl, mcvax!botter!maart
  22.  
  23. : This is a shar archive.  Extract with sh, not csh.
  24. : This archive ends with exit, so do not worry about trailing junk.
  25. : --------------------------- cut here --------------------------
  26. PATH=/bin:/usr/bin:/usr/ucb
  27. echo Extracting 'ctrl.1'
  28. sed 's/^X//' > 'ctrl.1' << '+ END-OF-FILE ''ctrl.1'
  29. X.TH CTRL 1 Mar\ 29\ 1989
  30. X.SH NAME
  31. Xctrl, unesc \- translate printable characters to
  32. X.br
  33. X.RS
  34. X.RS
  35. X.RS
  36. Xcorresponding control characters
  37. X.RE
  38. X.RE
  39. X.RE
  40. X.br
  41. Xesc, bell, beep \- generate ESC and BEL characters
  42. X.SH SYNOPSIS
  43. X.B ctrl
  44. X.I string
  45. X.br
  46. X.B unesc
  47. X.I symbolic escape sequence
  48. X.br
  49. X.B esc
  50. X.br
  51. X.B bell
  52. X[
  53. X.I count
  54. X]
  55. X.br
  56. X.B beep
  57. X[
  58. X.I count
  59. X]
  60. X.SH DESCRIPTION
  61. XThe use of
  62. X.B ctrl
  63. Xin all its forms is to avoid real escape sequences in ordinary ASCII files,
  64. Xe.g.
  65. X.I .login.
  66. X.SH EXAMPLES
  67. Xunesc '^[[7m\fIStandout mode on a Sun console\fR.'
  68. X.br
  69. X.br
  70. X.RS
  71. Xis equivalent to
  72. X.RE
  73. X.br
  74. X.br
  75. Xecho "`esc`[7m\fIStandout mode on a Sun console\fR."
  76. X.br
  77. X.br
  78. Xctrl GG G
  79. X.br
  80. X.br
  81. X.RS
  82. Xis equivalent to
  83. X.RE
  84. X.br
  85. X.br
  86. Xbell 3
  87. X.SH AUTHOR
  88. XMaarten Litmaath @ VU Informatika Amsterdam
  89. X.br
  90. X(maart@cs.vu.nl)
  91. + END-OF-FILE ctrl.1
  92. chmod 'u=rw,g=r,o=r' 'ctrl.1'
  93. set `wc -c 'ctrl.1'`
  94. count=$1
  95. case $count in
  96. 759)    :;;
  97. *)    echo 'Bad character count in ''ctrl.1' >&2
  98.         echo 'Count should be 759' >&2
  99. esac
  100. echo Extracting 'Makefile'
  101. sed 's/^X//' > 'Makefile' << '+ END-OF-FILE ''Makefile'
  102. Xctrl:    ctrl.o myperror.o
  103. X    cc -O -x -n -s -o ctrl ctrl.o myperror.o
  104. X
  105. Xctrl.o:        ctrl.c
  106. X        cc -O -x -c ctrl.c
  107. X
  108. Xmyperror.o:    myperror.c
  109. X        cc -O -x -c myperror.c
  110. X
  111. Xinstall:    ctrl
  112. X        sh install.sh
  113. X        @echo Ready.
  114. + END-OF-FILE Makefile
  115. chmod 'u=rw,g=r,o=r' 'Makefile'
  116. set `wc -c 'Makefile'`
  117. count=$1
  118. case $count in
  119. 199)    :;;
  120. *)    echo 'Bad character count in ''Makefile' >&2
  121.         echo 'Count should be 199' >&2
  122. esac
  123. echo Extracting 'install.sh'
  124. sed 's/^X//' > 'install.sh' << '+ END-OF-FILE ''install.sh'
  125. X#!/bin/sh
  126. X
  127. X[ "x`echo -n x`" = "x-n x" ] && {
  128. X    C=\\c
  129. X    N=
  130. X} || {
  131. X    C=
  132. X    N=-n
  133. X}
  134. X
  135. Xecho $N 'Into which directory do you want "ctrl" c.s. to be placed? '$C
  136. X
  137. Xwhile :
  138. Xdo
  139. X    read dir
  140. X    [ = = "$dir" -o != = "$dir" ] && dir=./$dir
  141. X    [ -d "$dir" -a -x "$dir" -a -w "$dir" ] && break
  142. X    echo "There is no writable directory '$dir'."
  143. X    echo $N 'Try again: '$C
  144. Xdone
  145. X
  146. Xmv ctrl "$dir" || exit 1
  147. X
  148. Xcd "$dir" || exit 1
  149. X
  150. Xln ctrl unesc
  151. Xln ctrl esc
  152. Xln ctrl bell
  153. Xln ctrl beep
  154. + END-OF-FILE install.sh
  155. chmod 'u=rw,g=r,o=r' 'install.sh'
  156. set `wc -c 'install.sh'`
  157. count=$1
  158. case $count in
  159. 442)    :;;
  160. *)    echo 'Bad character count in ''install.sh' >&2
  161.         echo 'Count should be 442' >&2
  162. esac
  163. echo Extracting 'ctrl.c'
  164. sed 's/^X//' > 'ctrl.c' << '+ END-OF-FILE ''ctrl.c'
  165. X/*
  166. X * ctrl.c - translate printable characters to corresponding control characters
  167. X *          doesn't use stdio, to keep the size small
  168. X *
  169. X * author: Maarten Litmaath @ VU Informatika Amsterdam (maart@cs.vu.nl)
  170. X */
  171. X
  172. X#define        BUF_SIZE    1024
  173. X
  174. X
  175. Xint    ctrl(), unesc(), esc(), bell();
  176. X
  177. Xstruct    func {
  178. X        char    *name;
  179. X        int    (*func)();
  180. X    } ftab[] = {
  181. X        { "ctrl", ctrl },
  182. X        { "unesc", unesc },
  183. X        { "esc", esc },
  184. X        { 0, bell }
  185. X    };
  186. X
  187. X
  188. Xmain(argc, argv)
  189. Xint    argc;
  190. Xregister char    **argv;
  191. X{
  192. X    struct    func    *f = ftab;
  193. X    char    buf[BUF_SIZE], *name, *rindex();
  194. X    int    n, status = 0;
  195. X    void    myperror();
  196. X
  197. X
  198. X    if (!(name = rindex(*argv, '/')))
  199. X        name = *argv;
  200. X    else
  201. X        ++name;
  202. X    ++argv;
  203. X
  204. X    while (f->name && strcmp(f->name, name) != 0)
  205. X        ++f;
  206. X
  207. X    n = (*f->func)(argv, buf);
  208. X
  209. X    if (write(1, buf, n) != n) {
  210. X        myperror(name);
  211. X        status = 1;
  212. X    }
  213. X
  214. X    _exit(status);
  215. X}
  216. X
  217. X
  218. Xint    ctrl(argv, buf)
  219. Xregister char    **argv;
  220. Xchar    *buf;
  221. X{
  222. X    register char    *s, *p = buf, c;
  223. X
  224. X
  225. X    while (s = *argv++) {
  226. X        while (c = *s++)
  227. X            *p++ = '?' <= c && c <= '_' ? c ^ 0100 : c;
  228. X        *p++ = ' ';
  229. X    }
  230. X
  231. X    if (p != buf)
  232. X        --p;
  233. X
  234. X    *p++ = '\n';
  235. X    *p = '\0';
  236. X
  237. X    return p - buf;
  238. X}
  239. X
  240. X
  241. Xint    unesc(argv, buf)
  242. Xregister char    **argv;
  243. Xchar    *buf;
  244. X{
  245. X    register char    *s, *p = buf, c;
  246. X
  247. X
  248. X    while (s = *argv++) {
  249. X        while (c = *s++)
  250. X            switch (c) {
  251. X            case '\\':
  252. X                *p++ = *s ? *s++ : c;
  253. X                break;
  254. X            case '^':
  255. X                *p++ = '?' <= *s && *s <= '_' ? *s++ ^ 0100 :
  256. X                    *s ? *s++ : c;
  257. X                break;
  258. X            default:
  259. X                *p++ = c;
  260. X                break;
  261. X            }
  262. X        *p++ = ' ';
  263. X    }
  264. X
  265. X    if (p != buf)
  266. X        --p;
  267. X
  268. X    *p++ = '\n';
  269. X    *p = '\0';
  270. X
  271. X    return p - buf;
  272. X}
  273. X
  274. X
  275. Xint    esc(argv, buf)
  276. Xchar    **argv;
  277. Xregister char    *buf;
  278. X{
  279. X    *buf++ = '\033';
  280. X    *buf++ = '\n';
  281. X    *buf = '\0';
  282. X    return 2;
  283. X}
  284. X
  285. X
  286. Xint    bell(argv, buf)
  287. Xchar    **argv, *buf;
  288. X{
  289. X    register char    *p = buf;
  290. X    register int    n = *argv ? atoi(*argv) : 1;
  291. X
  292. X
  293. X    while (--n >= 0)
  294. X        *p++ = '\007';
  295. X
  296. X    *p++ = '\n';
  297. X    *p = '\0';
  298. X    return p - buf;
  299. X}
  300. + END-OF-FILE ctrl.c
  301. chmod 'u=rw,g=r,o=r' 'ctrl.c'
  302. set `wc -c 'ctrl.c'`
  303. count=$1
  304. case $count in
  305. 1818)    :;;
  306. *)    echo 'Bad character count in ''ctrl.c' >&2
  307.         echo 'Count should be 1818' >&2
  308. esac
  309. echo Extracting 'myperror.c'
  310. sed 's/^X//' > 'myperror.c' << '+ END-OF-FILE ''myperror.c'
  311. X/*
  312. X * myperror.c - unbuffered version of stdio perror(3s)
  313. X *
  314. X * author: Maarten Litmaath @ VU Informatika Amsterdam (maart@cs.vu.nl)
  315. X */
  316. X
  317. X#define        ERRBUF_SIZE        32
  318. X
  319. X
  320. Xvoid    myperror(s)
  321. Xchar    *s;
  322. X{
  323. X    extern    int    errno, sys_nerr;
  324. X    extern    char    *sys_errlist[];
  325. X    register char    *p;
  326. X    register int    n = 0;
  327. X    int    min = 0;
  328. X    char    buf[ERRBUF_SIZE];
  329. X
  330. X
  331. X    if (s && *s) {
  332. X        (void) write(2, s, strlen(s));
  333. X        (void) write(2, ": ", 2);
  334. X    }
  335. X
  336. X    if (0 <= errno && errno < sys_nerr)
  337. X        p = sys_errlist[errno];
  338. X    else {
  339. X        p ="Unknown error ";
  340. X        n = errno;
  341. X    }
  342. X
  343. X    (void) write(2, p, strlen(p));
  344. X
  345. X    if (n) {
  346. X        p = buf + sizeof buf;
  347. X        if (n < 0) {
  348. X            min = 1;
  349. X            n *= -1;
  350. X        }
  351. X        while (n) {
  352. X            *--p = '0' + n % 10;
  353. X            n /= 10;
  354. X        }
  355. X        if (min)
  356. X            *--p = '-';
  357. X        (void) write(2, p, buf + sizeof buf - p);
  358. X    }
  359. X    (void) write(2, "\n", 1);
  360. X}
  361. + END-OF-FILE myperror.c
  362. chmod 'u=rw,g=r,o=r' 'myperror.c'
  363. set `wc -c 'myperror.c'`
  364. count=$1
  365. case $count in
  366. 789)    :;;
  367. *)    echo 'Bad character count in ''myperror.c' >&2
  368.         echo 'Count should be 789' >&2
  369. esac
  370. exit 0
  371. -- 
  372. Please send comp.sources.unix-related mail to rsalz@uunet.uu.net.
  373.