Программы С, выполняемые интерпретатором Little С, никогда не компилируются и не компонуются, поэтому любая используемая в них библиотечная функция должна быть обработана непосредственно интерпретатором Little С. Лучше всего для этого создать интерфейсную функцию, вызываемую интерпретатором каждый раз при встрече библиотечной функции. Интерфейсная функция осуществляет подготовку к вызову библиотечной функции и обрабатывает возвращаемые значения.
В связи с ограниченным размером интерпретатора, Little С содержит только пять «библиотечных» функций: getche(), putch(), puts(), print() и getnum(). Конечно, в Стандарт С входит только функция puts(), выводящая строку на экран. Функция getche(), хотя и не предусмотрена в Стандарте, обычно включается в состав библиотек, так как она используется при работе в интерактивной среде. Она ожидает нажатия клавиши и возвращает связанное с ней значение. Следует отметить, что эта функция предусмотрена во многих компиляторах. Функция putch() также определена во многих компиляторах, предназначенных для создания программ, работающих в интерактивной среде. Она выводит на консоль один символ — ее аргумент. Вывод не буферизован. Функции getnum() и print() созданы автором. Функция getnum() возвращает целое число, равное числу, введенному с клавиатуры. Функция print() может выводить на экран как строковый, так и целочисленный аргумент, это очень удобно. Прототипы этих библиотечных функций приведены ниже[1]:
/* считывание символа с клавиатуры и возврат его значения */
int getche(void);
/* вывод символа на экран */
int putch(char ch);
/* вывод строки на экран */
int puts(char *s);
/* чтение целого числа с клавиатуры и возврат его значения */
int getnum(void);
/* вывод строки на экран */
int print(char *s);
или
/* вывод целого числа на экран */
int print(int i);
Тексты процедур библиотеки функций Little С приведены ниже. Файл называется LCLIB.C.
/****** Библиотека функций Little C *******/
/* Сюда можно добавлять новые функции. */
#include <conio.h> /* ели компилятор не поддерживает
данный заголовочный файл, этот #include можно удалять */
#include <stdio.h>
#include <stdlib.h>
extern char *prog; /* указывает на текущий символ в программе */
extern char token[80]; /* содержит строковое представление лексемы */
extern char token_type; /* содержит тип лексемы */
extern char tok; /* содержит внутренне представление лексемы */
enum tok_types {DELIMITER, IDENTIFIER, NUMBER, KEYWORD,
TEMP, STRING, BLOCK};
/* Эти константы используются для вызова функции sntx_err()
в случае синтаксической ошибки. При необходимости список
констант можно расширить.
ВНИМАНИЕ: константа SYNTAX используется тогда, когда
интерпритатор не может квалифицировать ошибку.
*/
enum error_msg
{SYNTAX, UNBAL_PARENS, NO_EXP, EQUALS_EXPECTED,
NOT_VAR, PARAM_ERR, SEMI_EXPECTED,
UNBAL_BRACES, FUNC_UNDEF, TYPE_EXPECTED,
NEST_FUNC, RET_NOCALL, PAREN_EXPECTED,
WHILE_EXPECTED, QUOTE_EXPECTED, NOT_STRING,
TOO_MANY_LVARS, DIV_BY_ZERO};
int get_token(void);
void sntx_err(int error), eval_exp(int *result);
void putback(void);
/* Считывание символа с консоли. Если компилятор
не поддерживает _getche(), то следует
использвать getchar() */
int call_getche()
{
char ch;
ch = _getche();
while(*prog!=')') prog++;
prog++; /* продвижение к концу строки */
return ch;
}
/* Вывод символа на экран. */
int call_putch()
{
int value;
eval_exp(&value);
printf("%c", value);
return value;
}
/* Вызов функции puts(). */
int call_puts(void)
{
get_token();
if(*token!='(') sntx_err(PAREN_EXPECTED);
get_token();
if(token_type!=STRING) sntx_err(QUOTE_EXPECTED);
puts(token);
get_token();
if(*token!=')') sntx_err(PAREN_EXPECTED);
get_token();
if(*token!=';') sntx_err(SEMI_EXPECTED);
putback();
return 0;
}
/* Встроенная функция консольного вывода. */
int print(void)
{
int i;
get_token();
if(*token!='(') sntx_err(PAREN_EXPECTED);
get_token();
if(token_type==STRING) { /* вывод строки */
printf("%s ", token);
}
else { /* вывод числа */
putback();
eval_exp(&i);
printf("%d ", i);
}
get_token();
if(*token!=')') sntx_err(PAREN_EXPECTED);
get_token();
if(*token!=';') sntx_err(SEMI_EXPECTED);
putback();
return 0;
}
/* Считывание целого числа с клавиатуры. */
int getnum(void)
{
char s[80];
gets(s);
while(*prog != ')') prog++;
prog++; /* продвижение к концу строки */
return atoi(s);
}
Для того чтобы добавить в библиотеку новые функции, следует сначала включить их имена и адреса интерфейсных функций в массив intern_func. После этого необходимо создать соответствующие интерфейсные функции, используя приведенные выше функции как пример.
[1]Язык Little С не поддерживает прототипы функций. Поэтому включать их в программу не следует. Здесь прототипы приведены в качестве справочной информации.