1 #ifndef FEVOICES_H
2 #define FEVOICES_H
3 /****************************************
4  * *  Computer Algebra System SINGULAR     *
5  * ****************************************/
6 /*
7  * * ABSTRACT: class Voice
8  * */
9 
10 #include "reporter/reporter.h"
11 
12 #include "resources/feResource.h"
13 
14 #include "kernel/structs.h"
15 
16 enum   feBufferTypes
17 {
18   BT_none  = 0,  // entry level
19   BT_break = 1,  // while, for
20   BT_proc,       // proc
21   BT_example,    // example
22   BT_file,       // <"file"
23   BT_execute,    // execute
24   BT_if,         // if
25   BT_else        // else
26 };
27 
28 enum   feBufferInputs
29 {
30   BI_stdin = 1,
31   BI_buffer,
32   BI_file
33 };
34 enum noeof_t
35 {
36   noeof_brace = 1,
37   noeof_asstring,
38   noeof_block,
39   noeof_bracket,
40   noeof_comment,
41   noeof_procname,
42   noeof_string
43 };  /* for scanner.l */
44 
45 EXTERN_VAR int yylineno;
46 EXTERN_VAR char my_yylinebuf[80];
47 extern const char sNoName_fe[];
48 
49 #ifdef __cplusplus
50 
51 /* the C++-part: */
52 
53 // LANG_TOP     : Toplevel package only
54 // LANG_SINGULAR:
55 // LANG_C       :
56 //
57 
58 class Voice
59 {
60   public:
61     Voice  * next;
62     Voice  * prev;
63     char   * filename;    // file name or proc name
64     procinfo * pi;        // proc info
65     void   * oldb;        // internal scanner buffer
66     // for files only:
67     FILE * files;         // file handle
68     // for buffers only:
69     char * buffer;        // buffer pointer
70     long   fptr;          // current position in buffer
71     long   ftellptr;      // with glibc 2.22, file position gets lost
72                           // in sig_chld_hdl (ssi:ffork link), see examples/waitall.sing
73 
74     int    start_lineno;  // lineno, to restore in recursion
75     int    curr_lineno;   // current lineno
76     feBufferInputs   sw;  // BI_stdin: read from STDIN
77                           // BI_buffer: buffer
78                           // BI_file: files
79     char   ifsw;          // if-switch:
80             /*1 ifsw==0: no if statement, else is invalid
81             *       ==1: if (0) processed, execute else
82             *       ==2: if (1) processed, else allowed but not executed
83             */
84     feBufferTypes   typ;  // buffer type: see BT_..
85 
Voice()86   Voice() { memset(this,0,sizeof(*this));}
87   feBufferTypes Typ();
88   void Next();
89 } ;
90 
91 EXTERN_VAR Voice  *currentVoice;
92 
93 Voice * feInitStdin(Voice *pp);
94 
95 const  char * VoiceName();
96 int VoiceLine();
97 void    VoiceBackTrack();
98 BOOLEAN contBuffer(feBufferTypes typ);
99 BOOLEAN exitBuffer(feBufferTypes typ);
100 BOOLEAN exitVoice();
101 void    monitor(void *F, int mode); /* FILE*, int */
102 BOOLEAN newFile(char* fname);
103 void    newBuffer(char* s, feBufferTypes t, procinfo *pname = NULL, int start_lineno = 0);
104 void *  myynewbuffer();
105 void    myyoldbuffer(void * oldb);
106 
107 #endif
108 #endif
109 
110