URI: 
       tt18.c - plan9port - [fork] Plan 9 from user space
  HTML git clone git://src.adamsgaard.dk/plan9port
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
       tt18.c (1055B)
       ---
            1 #include "a.h"
            2 
            3 /*
            4  * 18. Insertions from the standard input
            5  */
            6 void
            7 r_rd(int argc, Rune **argv)
            8 {
            9         char *s;
           10         Rune *p;
           11         Fmt fmt;
           12         static int didstdin;
           13         static Biobuf bstdin;
           14 
           15         /*
           16          * print prompt, then read until double newline,
           17          * then run the text just read as though it were
           18          * a macro body, using the remaining arguments.
           19          */
           20         if(isatty(0)){
           21                 if(argc > 1)
           22                         fprint(2, "%S", argv[1]);
           23                 else
           24                         fprint(2, "%c", 7/*BEL*/);
           25         }
           26 
           27         if(!didstdin){
           28                 Binit(&bstdin, 0, OREAD);
           29                 didstdin = 1;
           30         }
           31         runefmtstrinit(&fmt);
           32         while((s = Brdstr(&bstdin, '\n', 0)) != nil){
           33                 if(s[0] == '\n'){
           34                         free(s);
           35                         break;
           36                 }
           37                 fmtprint(&fmt, "%s", s);
           38                 free(s);
           39         }
           40         p = runefmtstrflush(&fmt);
           41         if(p == nil)
           42                 warn("out of memory in %Crd", dot);
           43         ds(L(".rd"), p);
           44         argc--;
           45         argv++;
           46         argv[0] = L(".rd");
           47         runmacro('.', argc, argv);
           48         ds(L(".rd"), nil);
           49 }
           50 
           51 /* terminate exactly as if input had ended */
           52 void
           53 r_ex(int argc, Rune **argv)
           54 {
           55         USED(argc);
           56         USED(argv);
           57 
           58         while(popinput())
           59                 ;
           60 }
           61 
           62 void
           63 t18init(void)
           64 {
           65         addreq(L("rd"), r_rd, -1);
           66         addreq(L("ex"), r_ex, 0);
           67 }