| [7bef8cf] | 1 | #if 1
 | 
|---|
 | 2 | #include <fstream.hfa>
 | 
|---|
 | 3 | #include <coroutine.hfa>
 | 
|---|
 | 4 | 
 | 
|---|
 | 5 | coroutine Fmt {
 | 
|---|
 | 6 |         char ch;                                                                // communication variables
 | 
|---|
 | 7 |         int g, b;                                                               // needed in destructor
 | 
|---|
 | 8 | };
 | 
|---|
 | 9 | void main( Fmt & fmt ) with( fmt ) {
 | 
|---|
 | 10 |         for () {                                                                // for as many characters
 | 
|---|
 | 11 |                 for ( g = 0; g < 5; g += 1 ) {          // groups of 5 blocks
 | 
|---|
 | 12 |                         for ( b = 0; b < 4; b += 1 ) {  // blocks of 4 characters
 | 
|---|
 | 13 |                                 do {
 | 
|---|
 | 14 |                                         suspend();
 | 
|---|
 | 15 |                                 } while ( ch == '\n' || ch == '\t' );
 | 
|---|
 | 16 |                                 sout | ch;                                      // print character
 | 
|---|
 | 17 |                         }
 | 
|---|
 | 18 |                         sout | "  ";                                    // block separator
 | 
|---|
 | 19 |                 }
 | 
|---|
 | 20 |                 sout | nl;                                                      // group separator
 | 
|---|
 | 21 |         }
 | 
|---|
 | 22 | }
 | 
|---|
 | 23 | void ?{}( Fmt & fmt ) { resume( fmt ); } // prime (start) coroutine
 | 
|---|
 | 24 | void ^?{}( Fmt & fmt ) with( fmt ) { // destructor
 | 
|---|
 | 25 |         if ( g != 0 || b != 0 ) // special case
 | 
|---|
 | 26 |                 sout | nl; }
 | 
|---|
 | 27 | void send( Fmt & fmt, char c ) { fmt.ch = c; resume( fmt ); }
 | 
|---|
 | 28 | int main() {
 | 
|---|
 | 29 |         Fmt fmt;
 | 
|---|
 | 30 |         sout | nlOff;                                                   // turn off auto newline
 | 
|---|
 | 31 |         for ( 41 )
 | 
|---|
 | 32 |                 send( fmt, 'a' );
 | 
|---|
 | 33 |   //    sout | nlOff;                                                   // turn off auto newline
 | 
|---|
 | 34 |   // eof: for () {                                                              // read until end of file
 | 
|---|
 | 35 |   //            sin | fmt.ch;                                           // read one character
 | 
|---|
 | 36 |   //      if ( eof( sin ) ) break eof;                  // eof ?
 | 
|---|
 | 37 |   //            format( fmt );                                          // push character for formatting
 | 
|---|
 | 38 |   //    }
 | 
|---|
 | 39 | }
 | 
|---|
 | 40 | #else
 | 
|---|
 | 41 | 
 | 
|---|
 | 42 | #include <stdio.h>
 | 
|---|
 | 43 | 
 | 
|---|
 | 44 | struct Format {
 | 
|---|
 | 45 |         char ch;                                                                // used for communication
 | 
|---|
 | 46 |         int g, b;                                                               // global because used in destructor
 | 
|---|
 | 47 | };
 | 
|---|
 | 48 | 
 | 
|---|
 | 49 | void format( struct Format * fmt ) {
 | 
|---|
 | 50 |         if ( fmt->ch != -1 ) { // not EOF ?
 | 
|---|
 | 51 | //              if ( fmt->ch == '\n' || fmt->ch == '\t' ) return;
 | 
|---|
 | 52 | //              printf( "%c %d %d", fmt->ch, fmt->g, fmt->b );          // character
 | 
|---|
 | 53 |                 printf( "%c", fmt->ch );                // character
 | 
|---|
 | 54 |                 fmt->b += 1;
 | 
|---|
 | 55 |                 if ( fmt->b == 4 ) {    // block ?
 | 
|---|
 | 56 |                         printf( "  " ); // separator
 | 
|---|
 | 57 |                         fmt->b = 0;
 | 
|---|
 | 58 |                         fmt->g += 1;
 | 
|---|
 | 59 |                 }
 | 
|---|
 | 60 |                 if ( fmt->g == 5 ) {    // group ?
 | 
|---|
 | 61 |                         printf( "\n" ); // separator
 | 
|---|
 | 62 |                         fmt->g = 0;
 | 
|---|
 | 63 |                 }
 | 
|---|
 | 64 |         } else {
 | 
|---|
 | 65 |                 if ( fmt->g != 0 || fmt->b != 0 ) printf( "\n" );
 | 
|---|
 | 66 |         }
 | 
|---|
 | 67 | }
 | 
|---|
 | 68 | int main() {
 | 
|---|
 | 69 |         struct Format fmt = { 0, 0, 0 };
 | 
|---|
 | 70 |         for ( ;; ) {
 | 
|---|
 | 71 |                 scanf( "%c", &fmt.ch );
 | 
|---|
 | 72 |           if ( feof( stdin ) ) break;
 | 
|---|
 | 73 |                 format( &fmt );
 | 
|---|
 | 74 |         }
 | 
|---|
 | 75 |         fmt.ch = -1;
 | 
|---|
 | 76 |         format( &fmt );
 | 
|---|
 | 77 | }
 | 
|---|
 | 78 | #endif
 | 
|---|
 | 79 | 
 | 
|---|
 | 80 | // Local Variables: //
 | 
|---|
 | 81 | // tab-width: 4 //
 | 
|---|
 | 82 | // fill-column: 120 //
 | 
|---|
 | 83 | // compile-command: "cfa Format.cfa" //
 | 
|---|
 | 84 | // End: //
 | 
|---|