
# define FILE_LIMIT 40

     /* In OS Windows the followwing limit actually equals 8191.
        Under Linux it depends on the Linux-version.
        shell> getconf ARG_MAX
        shell> 2097152
     */
#	define MAX_SYSTEM_CALL 1024

# define ENV_VARNAME_MAX   256
# define ENV_VARVALUE_MAX  1024


      /* Encode type */
# define ENC_FLAT    1
# define ENC_BINARY  2
/*? # define ENC_ASCII ENC_FLAT */
# define ENC_LATIN_1 ENC_FLAT
# define ENC_UTF_8    10
# define ENC_UTF_16LE 32
# define ENC_UTF_16BE 33
// # define IS_ENC_UTF_16(m)   ((m & ENC_UTF_16LE) == ENC_UTF_16LE)
# define IS_ENC_UTF_16(m)   (m & ENC_UTF_16LE)
# define ENC_UTF_32LE 64
# define ENC_UTF_32BE 65
// # define IS_ENC_UTF_32(m)   ((m & ENC_UTF_32LE) == ENC_UTF_32LE)
# define IS_ENC_UTF_32(m)   (m & ENC_UTF_32LE)
# define ENC_NONFLAT ENC_UTF_8
// # define REACH       20
# define ENC_BOM     20
# define ENC_UNKNOWN 21

# define RF_STREAM_START 0
# define RF_BOM_UTF_8    1
# define RF_BOM_UTF_16LE 2
# define RF_BOM_UTF_16BE 3
# define RF_BOM_UTF_32LE 4
# define RF_BOM_UTF_32BE 5

/* The following non-standard numeration of the std-streems was forced by the requirment
   that all early written Refal-5 programs should work in the new utf-8 version.
   See the definition of rf_put function (file func1.c) for an example, 
   which is fixed still by the first developers of the Refal-5 system.   
*/ 
# define R_STDERR 0
# define R_STDIN  1
# define R_STDOUT 2
# define R_STDAUX 3
# define R_STDPRN 4

# define PrefixId 1
# define VarId PrefixId
# define IndexId  2
# define PrefixPreWord  3
# define IndexPreWord   4
# define IS_PREFIX(flag) ((flag & PrefixId) == 1)
# define IS_INDEX(flag)  ((flag == IndexId) || (flag == IndexPreWord))

        /* The following marker informs that no character was saved by ungot */
# define EMPTY_MARKER '\n'
# define FORBIDDEN_STREAM_MARKER -1

/*  Byte Order Mark, U+FEFF */
/* Согласно спецификации Юникода, маркер может стоять только в самом начале файла или потока. 
  Если же символ U+FEFF встречается в середине потока данных, он должен интерпретироваться 
  как «нулевой ширины неразрывный пробел» (по существу, неотображаемый и ничего не меняющий символ). Однако, большинство браузеров, 
  кроме Opera версий 12 и ниже, воспринимают BOM в середине документа как символ, занимающий целую строку, после чего генерируют перенос строки.
  
  Если формат представления символов Юникода точно известен принимающей программе заранее, 
  то по стандарту Юникода маркер ставить не следует. 
  И если формат объявлен другим способом (например, MIME в поле заголовка Content-Type), маркер по стандарту ставить не полагается. 
  
  По тому, как закодирован маркер последовательности байтов, стоящий в начале файла или потока, можно легко определить кодировку и порядок байтов, 
  использованные для кодирования символов Юникода во всём данном файле или потоке.   
  UTF-8: 	      0xEFBBBF 	239187191
  UTF-16 (BE): 	0xFEFF   	254255
  UTF-16 (LE): 	0xFFFE 	   255254
  UTF-32 (BE): 	0x0000FEFF 	00254255
  UTF-32 (LE): 	0xFFFE0000 	25525400
  
  Есть случаи, когда использования маркера последовательности байтов следует избегать, несмотря на удобства его применения. 
  Например, использование маркера в веб-шаблонах вызывает появление пустых строк в документе, поэтому рекомендуется удалять 
  маркер из веб-скриптов и CSS-файлов. А наличие маркера в начале файлов PHP (до тега <?php) приводит к тому, 
  что пустая строка отправляется клиенту ещё до начала выполнения кода, что вызывает сбой в тех случаях, 
  когда клиенту должен сразу отправиться HTTP-заголовок (при переадресации запроса, например). 
  Также может неверно отрабатывать json_decode, если json записан в файл с BOM. 
  
  https://ru.wikipedia.org/wiki/%D0%9C%D0%B0%D1%80%D0%BA%D0%B5%D1%80_%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D0%BE%D0%B2%D0%B0%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D0%BE%D1%81%D1%82%D0%B8_%D0%B1%D0%B0%D0%B9%D1%82%D0%BE%D0%B2 
*/
// # define R_BOM 

		/* FILE   I/O.		*/

# ifdef DEFINE_EXTERNALS

	FILE *file_table[FILE_LIMIT];
//Was:   int fmode_table[FILE_LIMIT][2];
   int fmode_table[FILE_LIMIT][3];
//-   int fmode_table[FILE_LIMIT][4];
   int std_streem_fmodes[5];

# else

	extern FILE *file_table[FILE_LIMIT];
	
	
	        /* fmode_table: [fd][0] is used for stream-open-on, 
	                        [fd][1] is used for stream-encoding, 
	                        [fd][2] is used for stream-ungetchar, 
	                        
	                        the following is cancelled:
	                        [fd][3] is used for stream-start-state // The first stream line is read in the start state,
	                                                               // while other lines are read in the non-start state.
             For example: fmode_table[fd][1] is the encoding for the stream labeled with descriptor fd;
	        */
//Was:	extern int fmode_table[FILE_LIMIT][2];
	extern int fmode_table[FILE_LIMIT][3];
//-	extern int fmode_table[FILE_LIMIT][4];
    /* 0 = stderr; 1 = stdin; 2 = stdout; 3 = stdaux, std port; 4 = stdprn, std printer are std value for fmode_table[0]
    */
   extern int std_streem_fmodes[5];

# endif

# ifdef BY_GCC_MINGW_WIN
#   define REF_LU "%llu"
#   define REF_LU_SP "%llu "
# else 
#   define REF_LU "%lu"
#   define REF_LU_SP "%lu "
# endif 

 
 