Ignore:
Timestamp:
Aug 17, 2024, 3:15:21 PM (3 months ago)
Author:
Peter A. Buhr <pabuhr@…>
Branches:
master
Children:
df2e00f
Parents:
afb15cf
Message:

first attempt changing end-of-file to an exception

File:
1 edited

Legend:

Unmodified
Added
Removed
  • tests/generator/.in/fmtLines.txt

    rafb15cf r3ac5fd8  
    55// file "LICENCE" distributed with Cforall.
    66//
    7 // fmtLines.cc --
     7// fmtLines.cfa -- format characters into blocks of 4 and groups of 5 blocks per line
    88//
    9 // Author           : Peter A. Buhr
    10 // Created On       : Sun Sep 17 21:56:15 2017
     9// Author           : Thierry Delisle
     10// Created On       : Thu Mar  5 16:09:08 2020
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Fri Mar 22 13:41:03 2019
    13 // Update Count     : 33
     12// Last Modified On : Sat Aug 17 14:21:28 2024
     13// Update Count     : 5
    1414//
    1515
    1616#include <fstream.hfa>
    17 #include <coroutine.hfa>
    1817
    19 coroutine Format {
     18generator Format {
    2019        char ch;                                                                                        // used for communication
    2120        int g, b;                                                                                       // global because used in destructor
    2221};
    2322
    24 void ?{}( Format & fmt ) {
    25     resume( fmt );                                                                              // start coroutine
    26 }
    27 
    28 void ^?{}( Format & fmt ) {
    29     if ( fmt.g != 0 || fmt.b != 0 ) sout | nl;
    30 }
    31 
    32 void main( Format & fmt ) {
    33         for ( ;; ) {                                                                            // for as many characters
    34                 for ( fmt.g = 0; fmt.g < 5; fmt.g += 1 ) {              // groups of 5 blocks
    35                         for ( fmt.b = 0; fmt.b < 4; fmt.b += 1 ) {      // blocks of 4 characters
    36                                 for ( ;; ) {                                                    // for newline characters
     23void main( Format & fmt ) with( fmt ) {
     24        for () {                                                                                        // for as many characters
     25                for ( g = 0; g < 5; g += 1 ) {                                  // groups of 5 blocks
     26                        for ( b = 0; b < 4; b += 1 ) {                          // blocks of 4 characters
     27                                for () {                                                                // for newline characters
    3728                                        suspend;
    38                                         if ( fmt.ch != '\n' ) break;            // ignore newline
     29                                  if ( ch != '\n' ) break;                              // ignore newline
    3930                                } // for
    40                                 sout | fmt.ch;                                                  // print character
     31                                sout | ch;                                                              // print character
    4132                        } // for
    4233                        sout | "  ";                                                            // print block separator
    4334                } // for
    44                 sout | nl;                                                                      // print group separator
     35                sout | nl;                                                                              // print group separator
    4536        } // for
    4637} // main
    4738
    48 void prt( Format & fmt, char ch ) {
    49     fmt.ch = ch;
    50     resume( fmt );
    51 } // prt
     39void ?{}( Format & fmt ) {
     40        resume( fmt );                                                                          // prime (start) coroutine
     41}
     42
     43void ^?{}( Format & fmt ) with( fmt ) {
     44        if ( g != 0 || b != 0 ) sout | nl;
     45}
     46
     47void format( Format & fmt ) {
     48        resume( fmt );
     49} // format
    5250
    5351int main() {
    5452        Format fmt;
    55         char ch;
     53        sout | nlOff;                                                                           // turn off auto newline
    5654
    57         for ( ;; ) {
    58                 sin | ch;                                                                               // read one character
    59           if ( eof( sin ) ) break;                                                      // eof ?
    60                 prt( fmt, ch );
    61         } // for
     55        try {
     56                for () {                                                                                // read until end of file
     57                        sin | fmt.ch;                                                           // read one character
     58                        format( fmt );                                                          // push character for formatting
     59                } // for
     60        } catch( end_of_file * ) {
     61        } // try
    6262} // main
    63 
    64 // Local Variables: //
    65 // tab-width: 4 //
    66 // compile-command: "cfa fmtLines.cfa" //
    67 // End: //
Note: See TracChangeset for help on using the changeset viewer.