diff --git a/docs/2-syntax.md b/docs/2-syntax.md index 5957194..64e6bab 100644 --- a/docs/2-syntax.md +++ b/docs/2-syntax.md @@ -1033,8 +1033,8 @@ N — число двоичных разрядов типа `unsigned long` и * `'B'` — скобочный терм. Подтип всегда `'0'`. Работа функции зависит от установленной локали (которая по умолчанию вроде -`"C"`), если локаль изменена (конфигурацией операционной системы или нативной -вставкой), то функция будет работать иначе. Лексический анализатор полагается +`"C"`), если локаль изменена (конфигурацией операционной системы или внешней функцией +на Си), то функция будет работать иначе. Лексический анализатор полагается на эту функцию. **Совместимость с Рефалом-5.** В Рефале-5 тип `'W'` используется для слов, подтип @@ -1191,7 +1191,6 @@ N — число двоичных разрядов типа `unsigned long` и псевдокомментариями — вопрос личных предпочтений. * Если косвенный вызов функции осуществляется из другого файла, вызываемая функция должна быть определена как entry (подробнее — через один подраздел). -* Нельзя использовать нативные вставки. * Если программа читает аргументы командной строки, они не должны начинаться со знака `-`, поскольку они игнорируются `refgo`. @@ -1236,9 +1235,6 @@ N — число двоичных разрядов типа `unsigned long` и * По субъективному мнению автора программировать на общем подмножестве интереснее, чем на чистом Рефале-05. -Очевидное исключение, когда не нужно писать на подмножестве — написание модулей -с нативными вставками. - ### Куда поместить `$ENUM` и `$EENUM`: псевдокомментарии Рефал-5 ключевые слова `$ENUM` и `$EENUM` не понимает. Функции, у которых между diff --git a/docs/3-install-and-usage.md b/docs/3-install-and-usage.md index 9621553..a778e0a 100644 --- a/docs/3-install-and-usage.md +++ b/docs/3-install-and-usage.md @@ -283,8 +283,8 @@ _библиотеку поддержки времени выполнения_ (r Рассмотрим каждую из строчек подробнее: * `Total program time` — общее время выполнения, от запуска до завершения. -* `Builtin time` — время выполнения функций, описанных при помощи нативных - вставок. Это прежде всего встроенные функции. +* `Builtin time` — время выполнения функций, написанных вручную на Си. + Это прежде всего встроенные функции. * `(Total refal time)` — суммарное время выполнения функций, написанных на Рефале. В сумме с `Builtin time` должно давать 100 %. * `Linear pattern time` — «линейное» время сопоставления с образцом. Это @@ -347,7 +347,7 @@ _библиотеку поддержки времени выполнения_ (r Макрос влияет на дамп, выводимый как при ошибке, так и при установленном макросе `R05_SHOW_DEBUG`. -Макрос предназначен для отладки рантайма и нативных функций, но может быть +Макрос предназначен для отладки рантайма и функций, написанных на Си, но может быть полезен для программ, которые почему-то требуют много памяти и вылетают от её недостатка. @@ -376,8 +376,8 @@ _библиотеку поддержки времени выполнения_ (r * Сгенерированные функции, как правило, очень длинные, их читать и понимать сложнее. -Однако, отладчик **полезен** при отладке нативных функций (которые сами пишутся -на Си) или рантайма. В частности, автор использовал GDB для просмотра +Однако, отладчик **полезен** при отладке функций, которые сами пишутся +на Си, или рантайма. В частности, автор использовал GDB для просмотра точки падения и трассировки стека при ошибках доступа к памяти (SEGFAULT’ах). ### Отладчики Рефала-5 (`reftr`) и Рефала-5λ @@ -385,9 +385,7 @@ _библиотеку поддержки времени выполнения_ (r Если программа написана на общем подмножестве, то её можно собрать другим компилятором Рефала-5 и использовать средства отладки другой реализации. -Метод неприменим, если программа не написана на общем подмножестве, в частности -использует нативные вставки. В таком случае модули с нативными вставками -придётся подменять модулями-заглушками и отлаживать с ними. +Метод неприменим, если программа не написана на общем подмножестве. ### Отладка на уровне исходного кода — отладочная печать @@ -629,7 +627,7 @@ e-переменную на верхнем уровне, допустить о * ошибка невозможности отождествления — код `201`, * ошибка нехватки памяти — код `202`, -* ошибка во встроенной (нативной) функции — код `203`. +* ошибка во встроенной функции или внешней функции, написанной на Си, — код `203`. [PZ]: http://www.botik.ru/pub/local/scp/refal5/ diff --git a/docs/4-libraryex-components.md b/docs/4-libraryex-components.md index 0d2b1c0..72ef9d9 100644 --- a/docs/4-libraryex-components.md +++ b/docs/4-libraryex-components.md @@ -34,7 +34,7 @@ ---------------------- В отличие от библиотеки встроенных функций `Library`, библиотека `LibraryEx` -написана на Рефале без нативных вставок, а значит, принципиально новых +написана на Рефале, а значит, принципиально новых возможностей не несёт. Всё, что в ней есть — это надстройки над встроенными функциями и другие функции, облегчающие программирование на Рефале. @@ -337,13 +337,11 @@ t.TreeItem ::= (Extern e.Name) | (Function s.Scope (e.Name) e.Body) - | (Native e.Native) e.Name ::= s.CHAR+ s.Scope ::= Entry | Local - e.Body ::= Sentences t.Sentence* | Native e.Native - e.Native ::= (e.SourceName s.Line) (s.CHAR*)* + e.Body ::= Sentences t.Sentence* s.Line ::= s.NUMBER e.SourceName ::= s.CHAR+ @@ -368,7 +366,6 @@ == s.CHAR* -- '$ENTRY' == s.CHAR* -- пусто == s.CHAR* - == s.CHAR* == s.CHAR* == s.CHAR* @@ -399,9 +396,6 @@ == s.CHAR* -Нативная вставка `e.Native` содержит номер строки и имя исходного файла для -того, чтобы при генерации кода можно было добавить директиву `#line`. - Образец и результат описываются одинаковым синтаксическим деревом, разница только в том, что в образце не может быть `CallBrackets` (что гарантирует парсер). @@ -484,14 +478,6 @@ функция записывает исходный текст в файл (используя `SaveFile`, т.е. файл № 39), вторая возвращает сгенерированный текст как последовательность строк. -Вокруг каждой нативной вставки добавляются директивы `#line`, сообщающие -компилятору Си позицию последующего кода. Координаты (имя файла и номер строки) -для первой директивы извлекаются из синтаксического дерева. Координаты для -второй директивы зависят от функции. Функция `R05-Generate-ToFile` указывает -имя файла, равное `e.OutputName` и номер строки в сгенерированном коде. -Функция `R05-Generate-ToLines` сообщает номер строки в сгенерированном коде, -но в качестве имени файла указывает `""`. - Лексический анализ Рефала-05 — компонент `R05-Lexer` ---------------------------------------------------- @@ -516,12 +502,10 @@ указанную строку. Функция `R05-LexScan-File` читает файл при помощи `LoadFile`, а значит, -использует файл № 39. Позиции токенов соответствуют актуальным позициям в файле, -для токена `TkNative` имя файла соответствует имени в аргументе. +использует файл № 39. Позиции токенов соответствуют актуальным позициям в файле. Функция `R05-LexScan-String` устанавливает позиции токенов такими, какими они -были бы, если бы текст был сохранён в файле. В качестве имени файла для -`TkNative` используется имя `''`. +были бы, если бы текст был сохранён в файле. Позиция записывается как пара чисел — номер строки и номер колонки. Табуляция считается за одну колонку. @@ -540,7 +524,6 @@ | TkError e.Message | TkExtern | TkName e.Name - | TkNative (e.SourceName s.LineNo) (s.CHAR*)* | TkNumber s.NUMBER | TkOpen s.Bracket | TkOpenBlock @@ -584,14 +567,8 @@ * целое число — `TkNumber`, атрибут — его значение как число, * литера — `TkChar`, атрибут — литера, * переменная — `TkVariable`, атрибут — тип и индекс переменной, -* нативная вставка — `TkNative`, атрибут — её координаты (имя файла и номер - строки) и последовательность строк как скобочных термов (см. функции - `R05-LexScan-File` и `R05-LexScan-String` выше), * служебные токены `TkEOF`, `TkError`, `TkUnexpected`. -Функция `TkNative` при вызове со своим атрибутом форматирует нативную вставку -как есть, предваряя её однострочным комментарием с исходными координатами. - `TkEOF` атрибута не имеет, возвращается лексером при достижении конца ввода (конца файла для `R05-LexScan-File` или конца строки `R05-LexScan-String`). Вызов `TkEOF` порождает комментарий `/* end of file */`. @@ -618,8 +595,7 @@ Функция возвращает человекочитаемое представление токена, которое можно использовать, например, в сообщениях об ошибке. В текущей реализации она -вызывает сам токен, как функцию, за исключением `TkNative` и `TkUnexpected`. -В первом случае она не распечатывает содержимое нативной вставки, во втором — +вызывает сам токен, как функцию, за исключением `TkUnexpected` — она форматирует его как сообщение об ошибке. ### Функция `R05-LexDump` diff --git a/docs/5-implementation.md b/docs/5-implementation.md index 549c2cc..4135baf 100644 --- a/docs/5-implementation.md +++ b/docs/5-implementation.md @@ -11,7 +11,7 @@ в технические подробности. Эту главу рекомендуется прочитать всем, поскольку изложенные в ней сведения нужны, чтобы писать эффективные программы для данной реализации. Последующие главы будут необходимы лишь для разработки -нативных функций и для доработки самого компилятора. +собственных внешних функций на Си и для доработки самого компилятора. Во второй главе будут обсуждаться структуры данных поля зрения уже в терминах языка Си, реализация рефал-машины и идеология компиляции функций на Рефале @@ -19,10 +19,10 @@ файлов на Си станет частично понятным. Также в этой главе будут описаны те функции рантайма, которые используются в сгенерированном коде. -Третья глава является уже руководством по написанию нативных функций Рефала-05, -т.е. функций, тело которых описывается не на Рефале, а на Си. Будет описан -синтаксис для написания таких функций, а также функции рантайма, предназначенные -уже для использования программистом. +Третья глава является уже руководством по написанию функций на Си, которые +можно вызывать из Рефала. В ней будет приведён пример написания такой функции, +а также будут рассмотрены функции рантайма, предназначенные для использования +программистом. Что это значит — списковая реализация Рефала? @@ -368,8 +368,8 @@ _повторной,)_ то для неё запоминаются все вх После построения результата функция возвращает выполнение рефал-машине, а та ищет следующее первичное активное подвыражение. -Время выполнения нативной функции (т.е. функции, написанной не на Рефале, -а на Си) зависит уже от семантики и реализации самой функции. +Время выполнения функций, написанных на Си (в частности, встроенных функций) +зависит уже от семантики и реализации самой функции. ### Подытожим @@ -383,7 +383,7 @@ _повторной,)_ то для неё запоминаются все вх переменной — времени, пропорционального длине значения в узлах. * Если копируемых переменных нет, то время построения результата определяется только видом этого результата и не зависит от значений переменных. -* Время выполнения нативных функций определяется семантикой этих функций. +* Время выполнения функций, написанных на Си, определяется семантикой этих функций. * ДРУГИХ СКРЫТЫХ ЗАТРАТ ВРЕМЕНИ НЕТ. В частности, нет сборки мусора. В некотором смысле, Рефал со списковой реализацией — язык реального времени 😉. @@ -395,7 +395,7 @@ _повторной,)_ то для неё запоминаются все вх к этим метрикам в свете новых знаний. * `Total program time` — общее время выполнения программы. -* `Builtin time` — время выполнения нативных функций. +* `Builtin time` — время выполнения функций, написанных на Си. * `(Total refal time)` — суммарное время выполнения функций, написанных на Рефале. В сумме с `Builtin time` должно давать 100 %. * `Linear pattern time` — время сопоставления с образцом до цикла по открытой @@ -602,9 +602,8 @@ _повторной,)_ то для неё запоминаются все вх ### Общаая структура сгенерированного файла -Исходный файл на Рефале содержит объявления и определения функций и нативные -вставки (см. далее) и ничего больше. Сгенерированный код на Си имеет следующий -вид: +Исходный файл на Рефале содержит объявления и определения функций и ничего + больше. Сгенерированный код на Си имеет следующий вид: /* Automatically generated file. Don't edit! */ #include "refal05rts.h" @@ -612,7 +611,7 @@ _повторной,)_ то для неё запоминаются все вх 〈объявления всех используемых функций〉 - 〈определения функций и нативные вставки в порядке их следования в исходнике〉 + 〈определения функций в порядке их следования в исходнике〉 /* End of file */ @@ -626,8 +625,8 @@ _повторной,)_ то для неё запоминаются все вх функций. Благодаря этому в последующих определениях функций можно ссылаться на любые функции из текущей области видимости. -В следующей части записываются скомпилированные тела функций и текст нативных -вставок в том порядке, в каком они располагались в исходнике. +В следующей части записываются скомпилированные тела функций в том порядке, +в каком они располагались в исходнике. ### Функции в сгенерированном коде @@ -783,8 +782,8 @@ _нормализации_ — замены в нём всех минусов } Вызов `r05_this_is_generated_function();` добавляется в начало каждой функции, -написанной на Рефале — он сообщает профилировщику о том, что функция не нативная -(см. далее). +написанной на Рефале — он позволяет профилировщику отличать функции, написанные +на Рефале, от функций, написанных на Си, и считать время последних отдельно. Вызов `r05_recognition_impossible();` в конце завершает программу с выдачей сообщения об ошибке отождествления (recognition impossible) и аварийным дампом. @@ -830,8 +829,7 @@ _нормализации_ — замены в нём всех минусов Встроенные функции Рефала-05, написанные на Си, тоже следуют этому соглашению: если они прерывают программу с выдачей ошибки, поле зрения неизменно, когда они перекраивают поле зрения, формируя возвращаемое значение, они прерваться -не могут. При написании собственных нативных функций рекомендуется поступать -также. +не могут. При написании функций на Си вручную рекомендуется поступать также. Псевдокод предложения без открытых переменных имеет вид @@ -2160,7 +2158,7 @@ e-переменными такое присваивание нулей буде встроенные средства отладки и профилирования. Желающие могут прочитать исходники рантайма целиком ([`refal05rts.h`][h], [`refal05rts.c`][c]), они короткие, менее 2000 строк, но для прикладного программирования, включая даже написание -нативных вставок, это не нужно. Фрагменты исходников в этом параграфе даются +функций на Си, это не нужно. Фрагменты исходников в этом параграфе даются только в качестве иллюстрации. **Примечание.** Фрагменты исходного текста актуальны на момент написания @@ -2502,90 +2500,38 @@ e-переменными такое присваивание нулей буде } -Написание функций Рефала на Си: нативные вставки ------------------------------------------------- +Написание функций на Си, которые можно вызывать из Рефала +--------------------------------------------------------- -### Обзор нативных вставок +Рефал-05 позволяет программисту писать функции на Си и затем вызывать их из кода +на Рефале. Действительно: на вход компилятору могут быть переданы как исходники +на Рефале (расширение `.ref`), так и исходники на Си (расширение `.c`). Первые +будут откомпилированы в Си, и те, и другие будут переданы компилятору Си. -Точно также, как язык Си++ позволяет вставлять в исходный текст фрагменты -на ассемблере (ISO/IEC 14882, раздел 7.4 «The `asm` declaration»), Рефал-05 -позволяет вставлять в текст на Рефале фрагменты текста на Си. Строки кода -на Си ограничиваются строками, содержащими два знака процента (и только их): +Поэтому, если в исходнике написано `$EXTERN Foobar;`, компилятору не важно, +функция `Foobar` была написана на Рефале и скомпилирована в Си, или сразу была +написана на Си. - текст на Рефале - ... - %% - текст на языке Си - ... - %% - снова текст на Рефале - ... - -Поскольку Си является целевым языком только для данной реализации компилятора, -эту синтаксическую конструкцию мы будем называть _нативной вставкой,_ -подразумевая, что возможны реализации Рефала-05 в другой целевой код, и в этих -реализациях в подобном обрамлении будут записываться строки кода на другом -языке программирования. +Поэтому простейшим примером функции Рефала, написанной на Си, будет следующая +программа: -Нативные вставки допустимы только в двух контекстах: на верхнем синтаксическом -уровне, наравне с объявлениями и определениями функций, и внутри тела функции -_вместо_ предложений на Рефале. Простейший пример программы нативными вставками -обоих видов: - - %% #include - %% - - $ENTRY Go { - %% - printf("Hello, World!\n"); - r05_splice_to_freelist(arg_begin, arg_end); - %% - } - -В нативной вставке на верхнем уровне подключается заголовочный файл `stdio.h`, -в теле функции, описанном на Си, вызывается функция `printf()` из этого -заголовочного файла. Последующий вызов `r05_splice_to_freelist()` удаляет -из поля зрения первичное активное подвыражение. - -Нетрудно убедиться, что эта программа компилируется и работает так, как -ожидается: печатает на экране фразу `Hello, World!` и завершается. - -Можно предположить, что первая нативная вставка размещена в глобальной области -видимости, а вторая — внутри тела функции вместо того кода, который компилятор -генерирует для предложений. Так и есть. - -Сгенерированный код для этого примера выглядит так (предполагается, что исходный -файл назывался `native-hello.ref`): - - /* Automatically generated file. Don't edit! */ #include "refal05rts.h" - - R05_DECLARE_ENTRY_FUNCTION(Go) - - #line 2 "native-hello.ref" - #include - #line 10 "native-hello.c" R05_DEFINE_ENTRY_FUNCTION(Go) { - #line 7 "native-hello.ref" printf("Hello, World!\n"); r05_splice_to_freelist(arg_begin, arg_end); - #line 15 "native-hello.c" } +Здесь определена функция Рефала (посредством макроса `R05_DEFINE_ENTRY_FUNCTION`), +которая печатает сообщение при помощи функции `printf()` и удаляет свой вызов +из поля зрения. - /* End of file */ - -Директивы `#line`, которые окружают фрагменты кода из нативных вставок, -предписывают компилятору Си считать последующие строки считать строками -с соответствующим номером в файле с соответствующим именем. Они нужны для того, -чтобы при наличии синтаксической ошибки компилятор Си показывал не внутрь -сгенерированного файла, а в исходник на Рефале, содержащий код вставки. +Заметим, что в эту функцию мы намеренно не добавляли вызов +`r05_this_is_generated_function()`, нам нужно, чтобы профилировщик считал эту +функцию внешней функцией (замерял её время в метрике `Builtin time`). -Заметим, что в код функций, тело которых является нативной вставкой, -не добавляется вызов функции `r05_this_is_generated_function();`, а это значит, -что время выполнения этой функции не будет считаться временем кода на Рефале. +В дальнейшем мы рассмотрим более развёрнутый пример функции на Си. Как сказано в предыдущей главе, выполнение предложения делится на три стадии: @@ -2595,14 +2541,14 @@ _вместо_ предложений на Рефале. Простейший Первые два этапа не меняют поле зрения. Последний этап, который перекраивает поле зрения, не может прерваться остановкой с выдачей отладочного дампа. -При написании собственных нативных функций рекомендуется предерживаться +При написании собственных функций на Си рекомендуется предерживаться такого же соглашения. ### Дополнительные функции рантайма В первых двух главах была рассмотрена та часть API рантайма, которая используется сгенерированным кодом. В этом разделе мы перечислим функции, -которые используются при написании нативных вставок. +которые предназначены для использования в самописном коде на Си. size_t r05_read_chars( char buffer[], size_t buflen, @@ -2644,8 +2590,8 @@ _вместо_ предложений на Рефале. Простейший const char *r05_arg(int no); -Первые четыре функции завершают работу рефал-машины (и поэтому могут вызываться -только изнутри работающей рефал-машины — т.е. из нативной вставки), последняя +Первые четыре функции завершают работу рефал-машины и поэтому могут вызываться +только изнутри работающей рефал-машины. Последняя возвращает аргумент командной строки с указанным номером, либо пустую строку `""`, если запрашиваемый номер превышает количество актуальных аргументов. По сути функция `r05_arg()` реализует семантику встроенной функции `Arg` @@ -2662,7 +2608,7 @@ API рантайма. значение `errno` и его строковое представление, формируемое функцией `strerror()` стандартной библиотеки Си. -В пользовательских нативных функциях рекомендуется различать +В пользовательских функциях на Си рекомендуется различать `r05_recognition_impossible()` с одной стороны, и `r05_builtin_error***()` с другой. Если аргумент функции не соответствует ожидаемому формату, например, функция деления получила вместо чисел литеры или функции, либо функция открытия @@ -2674,7 +2620,7 @@ API рантайма. то рекомендуется использовать `r05_builtin_error_errno()` для формирования более детального сообщения об ошибке. -### Развёрнутый пример написания нативной функции +### Развёрнутый пример написания функции на Си Давайте напишем функцию, определяющую объём файла, для наглядности добавив в неё все мыслимые проверки. @@ -2729,23 +2675,29 @@ API рантайма. Рассмотрим текст функции (вместе с тестовым примером) целиком, а затем прокомментируем нюансы. - %% - #include - %% +Тестовый пример (`filesize-test.ref`): + + *$FROM filesize + $EXTERN FileSize; $ENTRY Go { - = ; + = ; } PrintSize { e.FileName = >; } +Исходный файл на Си (`filesize.c`): + + #include + #include "refal05rts.h" + + /* == s.NUMBER */ - FileSize { - %% + R05_DEFINE_ENTRY_FUNCTION(FileSize) { struct r05_node *fname_b, *fname_e; char filename[FILENAME_MAX + 1]; size_t filename_len; @@ -2799,14 +2751,12 @@ API рантайма. arg_begin->tag = R05_DATATAG_NUMBER; arg_begin->info.number = (r05_number) size; r05_splice_to_freelist(callee, arg_end); - %% } Поскольку мы пишем на языке Си89, мы вынуждены записывать объявления переменных до выполняемых операторов, поэтому функция начинается с объявлений: - FileSize { - %% + R05_DEFINE_ENTRY_FUNCTION(FileSize) { struct r05_node *fname_b, *fname_e; char filename[FILENAME_MAX + 1]; size_t filename_len; @@ -2917,7 +2867,6 @@ API рантайма. arg_begin->tag = R05_DATATAG_NUMBER; arg_begin->info.number = (r05_number) size; r05_splice_to_freelist(callee, arg_end); - %% } Здесь мы превращаем левую угловую скобку в символ-число со значением размера @@ -2931,7 +2880,6 @@ API рантайма. r05_splice_from_freelist(arg_begin); r05_splice_to_freelist(arg_begin, arg_end); - %% } Можно предположить, что этот вариант окажется медленнее, поскольку требуется @@ -2941,7 +2889,7 @@ API рантайма. памяти, хотя дополнительной памяти ей вовсе не требуется. Поэтому рекомендуется использовать первый вариант. -**Рекомендация.** Если нативная функция может повторно использовать часть +**Рекомендация.** Если функция на Си может повторно использовать часть аргумента для построения результата без дополнительных выделений памяти, и повторное использование не приводит к усложнению функции, то распределения памяти лучше избежать. diff --git a/docs/B-syntax-grammar.md b/docs/B-syntax-grammar.md index 32ebeca..e9c11a1 100644 --- a/docs/B-syntax-grammar.md +++ b/docs/B-syntax-grammar.md @@ -119,12 +119,6 @@ [ste]\.[A-Za-z0-9_\-]+ -Нативная вставка (в грамматике — `NATIVE`) — последовательность строк, которая -начинается и заканчивается строкой `%%`, внутри нативной вставки `%%` -недопустима: - - ^%%\n(([^%\n].*|%|%[^%\n].*)?\n)*%%\n - Грамматика Рефала-05 -------------------- @@ -151,11 +145,11 @@ LexicItem = CAPNAME | INQUOTES. Group = "(" Description ")" | "{" Description "}" | "[" Description "]". -Программа на Рефале-05 является последовательностью объявлений, определений -и нативных вставок, также допустимо любое количество незначащих точек с запятой +Программа на Рефале-05 является последовательностью объявлений и определений +функций, также допустимо любое количество незначащих точек с запятой на верхнем уровне: - Program = { Declaration | Definition | NATIVE | ";" }. + Program = { Declaration | Definition | ";" }. Объявление записывается как ключевое слово `$EXTERN`, за которым перечислены имена через запятую, завершается точкой с запятой: @@ -178,10 +172,9 @@ Function = ["$ENTRY"] NAME "{" Body "}". -Тело функции — это или нативная вставка, или последовательность предложений, -возможно пустая: +Тело функции — это последовательность предложений, возможно пустая: - Body = NATIVE | [ Sentences ]. + Body = [ Sentences ]. Предложения разделяются точкой с запятой, после последнего предложения точка с запятой необязательна. diff --git a/examples/filesize-test.ref b/examples/filesize-test.ref new file mode 100644 index 0000000..d00c9c5 --- /dev/null +++ b/examples/filesize-test.ref @@ -0,0 +1,10 @@ +*$FROM filesize +$EXTERN FileSize; + +$ENTRY Go { + = ; +} + +PrintSize { + e.FileName = >; +} diff --git a/examples/filesize.ref b/examples/filesize.c similarity index 90% rename from examples/filesize.ref rename to examples/filesize.c index cd9efd5..af736db 100644 --- a/examples/filesize.ref +++ b/examples/filesize.c @@ -1,20 +1,11 @@ -%% #include -%% +#include "refal05rts.h" -$ENTRY Go { - = ; -} - -PrintSize { - e.FileName = >; -} /* == s.NUMBER */ -FileSize { -%% +R05_DEFINE_ENTRY_FUNCTION(FileSize) { struct r05_node *fname_b, *fname_e; char filename[FILENAME_MAX + 1]; size_t filename_len; @@ -68,5 +59,4 @@ FileSize { arg_begin->tag = R05_DATATAG_NUMBER; arg_begin->info.number = (r05_number) size; r05_splice_to_freelist(callee, arg_end); -%% -} \ No newline at end of file +}