home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / unix / volume18 / ctrl < prev    next >
Text File  |  1989-04-19  |  6KB  |  367 lines

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