source: tests/coroutine/devicedriver.cfa @ 2e94d94f

ADTast-experimental
Last change on this file since 2e94d94f was 427854b, checked in by Thierry Delisle <tdelisle@…>, 5 years ago

First draft implementation of generators, still missing error checking, testing and clean-up

  • Property mode set to 100644
File size: 2.3 KB
RevLine 
[427854b]1//
[083203b]2// Cforall Version 1.0.0 Copyright (C) 2017 University of Waterloo
3//
4// The contents of this file are covered under the licence agreement in the
5// file "LICENCE" distributed with Cforall.
[427854b]6//
7// devicedriver.cfa --
8//
[083203b]9// Author           : Peter A. Buhr
10// Created On       : Sat Mar 16 15:30:34 2019
11// Last Modified By : Peter A. Buhr
[e7fdd76]12// Last Modified On : Sat Apr 20 09:07:19 2019
13// Update Count     : 90
[427854b]14//
[083203b]15
16#include <fstream.hfa>
17#include <coroutine.hfa>
18
19enum Status { CONT, MSG, ESTX, ELNTH, ECRC };
20coroutine Driver {
21        Status status;
22        char * msg, byte;
23}; // Driver
24
25void ?{}( Driver & d, char * m ) { d.msg = m; }
26Status next( Driver & d, char b ) with( d ) {
27        byte = b; resume( d ); return status;
28} // next
29
[7cfd6d4]30void checkCRC( Driver & d, unsigned int sum ) with( d ) {
[427854b]31        suspend;
[7cfd6d4]32        unsigned short int crc = byte << 8;                                     // sign extension over written
[427854b]33        suspend;
[7cfd6d4]34        // prevent sign extension for signed char
35        status = (crc | (unsigned char)byte) == sum ? MSG : ECRC;
36} // checkCRC
37
[083203b]38void main( Driver & d ) with( d ) {
39        enum { STX = '\002', ESC = '\033', ETX = '\003', MaxMsg = 64 };
40  msg: for () {                                                                                 // parse message
41                status = CONT;
42                unsigned int lnth = 0, sum = 0;
[427854b]43                while ( byte != STX ) suspend;
[083203b]44          emsg: for () {
[427854b]45                        suspend;
[083203b]46                        choose ( byte ) {                                                       // process byte
47                          case STX:
[427854b]48                                status = ESTX; suspend; continue msg;
[083203b]49                          case ETX:
50                                break emsg;
51                          case ESC:
[427854b]52                                suspend;
[083203b]53                        } // choose
54                        if ( lnth >= MaxMsg ) {                                         // buffer full ?
[427854b]55                                status = ELNTH; suspend; continue msg;
[083203b]56                        } // if
57                        msg[lnth++] = byte;
58                        sum += byte;
59                } // for
60                msg[lnth] = '\0';                                                               // terminate string
[7cfd6d4]61                checkCRC( d, sum );                                                             // refactor CRC check
[427854b]62                suspend;
[083203b]63        } // for
64} // main
65
66int main() {
67        char msg[65], byte;
68        Driver driver = { msg };
[e7fdd76]69
70        sin | nlOn;                                                                                     // read newline (all) characters
[083203b]71  eof: for () {                                                                                 // read until end of file
72                sin | byte;                                                                             // read one character
73          if ( eof( sin ) ) break eof;                                          // eof ?
74                choose( next( driver, byte ) ) {                                // analyse character
75                  case MSG:
76                        sout | "msg:" | msg;
77                  case ESTX:
78                        sout | "STX in message";
79                  case ELNTH:
80                        sout | "message too long";
81                  case ECRC:
82                        sout | "CRC failure";
83                  default: ;
84                } // choose
85        } // for
86} // main
87
88// Local Variables: //
89// tab-width: 4 //
90// compile-command: "cfa -g -Wall -Wextra devicedriver.cfa" //
91// End: //
Note: See TracBrowser for help on using the repository browser.