
Директива #define name [=value]
служит для создания макроопределения.
Она определяет макрос с именем name и присваивает ему значение value. Если последнее не указано,
будет определен «пустое макроопределение». Если макроопределение с таким именем уже существует,
его значение будет изменено на указанное. Далее при обработке строк исходного файла препроцессор
будет заменять встречающееся макроопределение на его значение
Директива #undefine name
удаляет определение макроса с именем name.
#macro name(a, b, c)
...
тело макрофункции
...
#endmacro
определяет макрофункцию с именем name и тремя параметрами a, b и c.
В дальнейшем, встретив это имя с таким же числом аргументов скобках, препроцессор выполнит его замену на код,
указанный в теле функции. В теле функции можно ссылаться на аргументы a, b и c.
Имеется перегрузка по количеству параметров. В теле функций можно вызывать другие макросы.
Но использование вложенных макросов при вызове невозможно, код
macro1(macro2())
работать не будет.
Директивы #defineblock begin
и #defineblock end
открывают и, соответственно, закрывают блок макрокода, содержимое которого не будет включаться в
результирующий текст программы. В этом блоке, например, могут быть определения макроконстант,
макрофункций и комментарии для них.
Для простого включения заголовочного файла используется директива вида #include "file.h"
.
Она вставляет все содержимое файла file.h в текст программы, начиная с текущей строки.
Директива вида #include<a\b\c>
будет преобразована препроцессором в
код подключения java-пакета import a.b.c
Директива вида #uselibrary "lib.jpl"
включает в код программы макроопределения,
макрофункции, процедуры и переменные, содержащиеся в библиотечном файле lib.jpl. При этом будут
вставлены только те процедуры и переменные библиотеки, которые используются программой, т.е., на
которые есть ссылка в коде.
Объявления функций и переменных библиотеки включаются в "скобки" маркерами #func #end
и #var #end
соответственно, как показано в примере ниже:
#var // объявление переменной
int var_name = var_value;
#end
#func // объявление функции
String func_name(int iarg_1, String arg_2) {
return (arg_1 + arg_2);
}
#end
#ifdef DEFINE_NAME_1
...
#endif
#ifnotdef DEFINE_NAME_2
...
#elseif DEFINE_NAME_3
...
#elseifnot DEFINE_NAME_4
...
#else
...
#endif
Встроенные макрофункции imagewidth()
и imageheight()
получают
в качестве своего единственного аргумента имя файла изображения (поддерживаются только формат png)
и подставляют ширину и выстоу изображения соответственно.
Эти функции можно использовать как при определении макроконстанты, при этом двойные кавычки могут
быть опущены, так и просто в любом месте программы.
#define SPRITE_WIDTH imagewidth("sprite.png")
#define SPRITE_HEIGHT imageheight(sprite.png)
Введены для удобства написания java кода, изначально предполагалось ввести некий метаязык, который будет транслироваться препроцессором как в Ява- так и в Си-код.
Ключевое слово cоnst
для java-программ будет заменено конструкцией
public [static] final
. Причем, слово static
будет вставлено только для главного класса файла, для его подклассов оно будет опущено (внутренние
классы не могут иметь статических элементов поскольку они сами не могут быть статическими).
Аналогично слово vаr
будет заменено на public [static]
,
funс -> public) [static] final
proс -> public [static] final void'
Список – это структура данных, представляющая собой коллекцию однотипных элементов (совокупностей макроопределений, идентификаторов и значений различных типов языка). Списки могут быть использованы, например, для работы со звуками, изображениями, элементами меню и строками локализованных ресурсов. Каждый элемент списка может состоять из нескольких элементов (их число назовем размером списка), причем, этот размер списка есть величина, неизменная для всех его элементов. Таким образом, список представляет собой некоторую прямоугольную матрицу элементов. Язык предпроцессора имеет средства, позволяющие работать со списками.
Объявление списка. Синтаксис объявления списка таков:
#list list_name
item_1_1, item_1_2, ..., item_1_m
item_2_1, item_2_2, ..., item_2_m
...
item_n_1, item_n_2, ..., item_n_m
#endlist
здесь n – число элементов в списке, m – размер списка
Для получения числа элементов списка служит макрометод списка count().
Например, следующая конструкция будет заменена макро-предпроцессором на число элементов списка
list_name:
list_name->(count)()
Аналогично макрометод size() возвращает размер списка.
Обращение к элементам списка осуществляется с помощью квадратных скобок так, как показано в
следующем примере:
list_name[item][sub_item]
здесь
item
– номер элемента (строки) списка (нумерация идет от нуля до count()-1
),
sub_item
– номер подэлемента (столбца, нумерация идет от нуля до size()-1
),
Итерация в списках.
Для того чтобы последовательно выполнить некоторую операцию с каждым элементом списка служит директива
#foreach
. Синтаксис ее использования следующий:
#foreach listname(index, sub_item1, sub_item_2, ..., sub_item_n)
//
// внутри блока код, выполняемый над каждым элементом списка,
//
// index получит номер элемента,
//
// а параметры sub_itemN могут быть использованы для обращения к подэлементам списка
//
#endforeach
Эти директивы позволяют добавлять и удалять файлы исходников и ресурсов к проекту непосредственно в процессе компиляции, изменять название и версию приложения а также его название и имя файла с путем. Данные директивы особенно актуальный при пакетной сборке.
Добавление и удаление ресурсных файлов
Директива
#make res +(-) ”filename.ext”
позволяет добавить (удалить) из включаемых в приложение ресурсов указанный файл. Имя файла указывается относительно каталога ресурсов. Для указания директории, в которой будут искаться ресурсные файлы служит директива
#make resourcespath "path"
Изменение имени файла приложения
Для указания/изменения имени файла приложения служит директива
#make outputfile ”filename”
Для определения/изменения директории, в которую будет записан файл(ы) скомпилированного приложения служит директива
#make outputdir ”path”
Директива #make appname ”name”
позволяет изменить название приложения,
а директива #make version version
- его версию.
Встроенная макрофункция toquote(str)
подставляет значение своего аргумента в кавычках
#error "msg"
выдает сообщение об ошибке во время обработки препроцессора
Стандартные макросы __DATЕ__
, __TIME__
,
__FILE__
, и __LINЕ__
заменяются на строку в
двойных кавычках с текущей датой, временем, именем файла и строкой в нем соответственно.
// информация об ошибке)
TSErrorRec = record
filename: string; // имя обрабатываемого файла
line: Integer; // номер строки в нем
pos: Integer; // позиция ошибки в строке
msg: string; // описание ошибки
end;
// описание ресурсного файла
TSResourceRec = record
filename: string; // имя файла
included: Boolean; // флаг того что этот флаг должен быть включен
end;
// запись в манифесте
TSManifestRec = record
name: string; // имя ключа
value: string; // значение
target: Integer; // тип манифеста: TSManifestJad или TSManifestMf
end;
// макроопределение
TSDefine = record
name: string; // имя ключа
value: string; // значение
end;
TSProject = class
// ПЕРЕМЕННЫЕ
name: string; // имя главного файла
caption: string; // название проекта
outFile: string; // имя файла результата компиляции
// с расширением и без пути
outFilePath: string; // путь для результирующего файла
// пути к каталогам
pathRoot: string; // каталог проекта
pathSources: string; // каталог исходных файлов
pathResources: string; // каталог ресурсов
pathBackup: string; // каталог резервных копий
pathBuild: string; // каталог, куда сохранятся результаты компиляции
pathPreprocessed: string; // каталог, куда сохранятся файлы,
// обработанные препроцессором
pathCompiled: string; // каталог, куда сохранятся скомпилированные файлы
pathPreverifed: string; // каталог, куда сохранятся преверифицированные файлы
pathObfuscated: string; // каталог, куда сохранятся обфусцированные файлы
// настройки компилятора
compilerDebugInfo: Boolean; // включать отладочную информацию
compilerCompress: Boolean; // сжимать результирующий файл
compilerCbfuscation: Boolean; // обфусцировать результирующий файл
compilerOptimizationSize: string;// строка-название типа оптимизации при компиляции
// манифесты java
manifestIcon: string; // путь к файлу иконки
manifestVendor: string; // имя производителя
manifestVersion: string; // версия мидлета
manifestBuild: Integer; // номер билда
manifestDescription: string; // описание
manifestBuildAutoinc: Boolean; // автоинкремент номера билда
// платформа
platformName: string; // id платформы, для которой компилируется проект
platformCaption: string; // название платформы
platformLang: string; // язык программирования для платформы
// устройство
deviceName: string; // id устройства, для которого компилируется проект
deviceCaption: string; // название устройства
deviceScreenWidth: Integer; // ширина экрана устройства
deviceScreenHeight: Integer; // высота экрана устройства
// МЕТОДЫ
function GetSourcesCount(): Integer;
function GetSourceName(index : Integer): string;
// получение числа исходных файлов и их полные имена
function GetResourcesCount(): Integer;
function GetResourceName(index : Integer): string;
// получение числа ресурсных файлов и их полные имена
function GetManifestRecCount(): Integer;
function GetManifestRecord(index : Integer): TSManifestRec;
// получение числа записей манифеста и их полные имена
function GetDefinesCount(): Integer;
function GetDefines(index : Integer): TSDefine;
// получение числа и значений макроопределений для препроцессора
// макроопределения могут быть переданы в командной строке,
//определены в конфигурации устройства и платформы
function GetDefinesStr(): string;
// возвращает список всех макроопределений в виде строки
// name1=value1;name2=value2;...
function GetDefine(сonst name : string): string;
function IsDefined(сonst name : string): Boolean;
// получение значений макроопределений по имени и проверка того,
// что макрозначение было определено
function GetLibrariesCount(): Integer;
function GetLibrariesName(index : Integer): string;
// получение путей к библиотечным файлам
// пути к библиотекам указываются в файлах конфигурации устройств
end;
Класс TSExecuter служит для выполнения консольных программ и получения результата и вывода stdout, stderr.
Скрипту компилятора доступен объект Executer этого класса.
TSExecuter = class
// ПЕРЕМЕННЫЕ
output: TStringList; // тут возвращает список строк stdout
errors: TStringList; // тут возвращает список строк stderr
resultCode: Integer; // тут будет сохранен код возврата после выполнения
// МЕТОДЫ
function ExecuteTA(сonst path, commandLine : string; timeOut : Integer): Boolean;
// выполняет утилиту
// path - путь к программе, commandLine - аргументы командной строки,
// timeOut - таймаут в миллисекундах
// возвращает true в случае успеха
function Execute(сonst commandLine : string): Boolean;
function ExecuteDir(сonst dir, fileName, commandLine : string): Boolean;
// выполнение без таймаута
end;
Класс препроцессора TSPreprocessor служит для препроцессорной обработки файлов и коллекций строк.
Скрипту компилятора доступен объект Preprocessor этого класса.
TSPreprocessor = class
// ПЕРЕМЕННЫЕ
outputDirectory: string; // каталог, куда будет сохранено собранное приложение
outputFile: string; // каталог, куда будет сохранено собранное приложение
applicationName: string; // название приложения
applicationVersion: string;// версия приложения
resourcesPath: string; // путь к каталогу с файлами ресурсов
// МЕТОДЫ
procedure Define(сonst name, value : string);
// определяет макроконстанту
procedure DefineList(сonst defines : string);;
// определяет список макроопределений по строке вида 'DEFINE1;DEFINE2=val2;DEFINE3'
procedure Reset();
// очищает все переменные объекта перед очередной операцией препроцессинга
function PreprocessFile(сonst sourceFileName, outputFileName : string): Boolean;
// препроцессинг файла с сохранением результата. Возвращает true,
// если не возникло ошибок
function PreprocessStrings(сonst source: TStringList; vаr
output : TStringList): Boolean;
// препроцессит коллекцию строк сохраняя результат в виде коллекции.
// Возвращает true, если не возникло ошибок
function GetErrorsCount(): Integer;
function GetErrors(index : Integer): TSErrorRec;
// получение списка ошибок препроцессинга
function GetResourcesCount(): Integer;
function GetErrors(index : Integer): TSResourceRec;
// список файлов ресурсов, которые надо включить/исключить командами #make res+|- file
procedure UpdateProjectResources(prj : TSProject);
// обновляет описание проекта после выполнения всех директив проепроцессора #make
procedure SetIncludePaths(list : TStringList);
procedure SetIncludePaths(list : TStringList);
// задать списки директорий, в которых будут искаться заголовочные файлы
// и файлы библиотек
function IsDefined(сonst name : string): Boolean;
// возвращает true, если макрос с таким именем определен
function GetDefine(сonst name : string): srting;
// возвращает значение макроопределения
end;
Класс TSFileReader предназначен для чтения текстовых и двоичных файлов.
TSFileReader = class
// ПЕРЕМЕННЫЕ
status: Boolean; // true, если не возникло ошибок
// МЕТОДЫ
constructor Create(сonst fileName : string);
// открывает файл
procedure Close();
// закрыть файл
function Readln(): string;
// читает строку до тех пор, пока не встретится символ конца строки
function ReadByte(): Integer;
function ReadWord(): Integer;
function ReadDword(): Integer;
// читают беззнаковые целые: 1, 2, 4 байта
function ReadShortInt(): Integer;
function ReadLongInt(): Integer;
// читает знаковые целые: 2 и 4 байта
function ReadString(sizeBytes : Integer): string;
// читает pascal-строку вида [длина, данные].
//sizeBytes указывает, сколько первых байт выделено на хранение длины
function Size(): Integer;
// возвращает размер файла
function Pos(): Integer;
// возвращает текущую позицию в файле
procedure Seek(pos : Integer);
// перевод текущей позиции
end;
Класс TSFileWriter предназначен для записи текстовых и двоичных файлов.
TSFileWriter = class
// ПЕРЕМЕННЫЕ
status: Boolean; // true, если не возникло ошибок
// МЕТОДЫ
constructor Create(сonst fileName : string);
// создает файл
procedure Close();
// закрыть файл
procedure Writeln(сonst str : string);
// записывает строку и признак перехода к новой строке
procedure Printf(сonst str : string; args: array of cоnst);
// записывает строку (без end of line) с использованием FmtStr()
procedure WriteByte(val : Integer);
procedure WriteWord(val : Integer);
procedure WriteDword(val : Integer);
// записывают беззнаковые целые: 1, 2, 4 байта
procedure WriteShortInt(val : ShortInt);
procedure WriteLongInt(val : Integer);
// записывает знаковые целые: 2 и 4 байта
procedure WriteString(сonst str : string; sizeBytes: Integer);
// записывает pascal-строку.
// sizeBytes указывает, сколько байт выделено на хранение длины.
// Байты длины сохраняются перед строкой
function Size(): Integer;
// возвращает размер файла
function Pos(): Integer;
// возвращает текущую позицию в файле
procedure Seek(pos : Integer);
// перевод текущей позиции
end;
Класс TSBase представляет базовые утилиты для взаимодействия со средой (IDE или консольный компилятор).
Скрипту компилятора доступен объект Base этого класса.
TBase = class
// МЕТОДЫ
procedure Error(сonst msg, fileName : string; line, pos : Integer);
// посылает сообщение об ошибке в IDE или консольному компилятору
procedure Warning(сonst msg, fileName : string; line, pos : Integer);
// посылает сообщение о предупреждении в IDE или консольному компилятору
procedure Msg(сonst msg : string);
// посылает информационное сообщение
procedure SetProgress(progress : Integer);
// посылает сообщение о прогрессе компиляции в процентах. Обновляет индикатор IDE
procedure SetCurrentFile(сonst fileName : string);
// определяет имя файла, который обрабатывается в данный момент. Выводится в окне IDE
function GetPath(сonst name : string): string;
// получает путь по идентификатору переменной.
// Переменные объявляются в файлах /xml/paths/*.xml
end;
function WordCount(сonst str, delims : string): Integer;
// возвращает количество слов в строке str для разделителей delims
function ExtractWord(сonst str : string; n: Integer; delims): Integer;
// возвращает слово под номером n в строке str для разделителей delims
// (нумерация от 1)
function WordPosition(сonst str : string; n: Integer; delims): Integer;
// возвращает позицию вхождения слова номер n в строке str для разделителей delims
// (нумерация от 1)
function ExtractFileName(сonst path : string): string;
// возвращает имя файла с расширением и без пути
function ExtractFileNameOnly(сonst path : string): string;
// возвращает только имя файла без расширением и без пути
function ExtractFileExt(сonst path : string): string;
// возвращает расширение файла (без точки)
function ExtractFileDir(сonst path : string): string;
// возвращает путь к файлу (без последнего слэша)
procedure VerifySlash(vаr path : string);
// проверяет, что имя директории содержит в конце слеш,
// все слэши соответствуют текущей системе (windows/linux)
function LowerCase(сonst path : string): string;
// переводит строку в нижний регистр
function UpperCase(сonst path : string): string;
// переводит строку в верхний регистр
function VerifyInt(сonst path : string): Boolean;
// возвращает true, если аргумент является правильным
// строковым представлением целого
Работа с файлами и каталогами
function VerifyDir(сonst path : string): Boolean;
// проверяет существование указанного каталога и создает его, если надо
// возвращает TRUE, если каталог существовал и FALSE, если он был создан
function DeleteFile(сonst fileMask : string): Boolean;
// удаляет файл/файлы по маске
// возвращает TRUE, если был удален хоть один файл
function CopyFile(сonst srcPath, destPath : string): Boolean;
// копирует файл
// возвращает TRUE в случае успешного выполнения операции
function RenameFile(сonst srcPath, destPath : string): Boolean;
// переименовывает файл
// возвращает TRUE в случае успешного выполнения операции
function GetFileSize(сonst path : string): Integer;
// возвращает размер файла или -1, если файл не существует
function SetCurrentDir(сonst path : string): Boolean;
// задает текущую директорию
// возвращает TRUE в случае успешного выполнения операции
function GetCurrentDir(): string;
// возвращает текущую директорию
Каталог | Файл | Описание |
---|---|---|
bin | Исполняемые файлы MobileStudio и их ресурсы | |
ColorEditor.exe | утилита выбора цвета и представления его формате Си/Pascal/Hex, с возможным автокопированием результата в буффер обмена | |
MobileStudio.exe | файл запуска графической IDE | |
mscc.exe | консольный компилятор (mobilestudio console compiler) | |
mstcc.exe | утилита для создания проектов по шаблонам (mobilestudio template creater) | |
UniDesigner.exe | графический дизайнер файлов подсветки синтаксиса из пакета UniHighlighter | |
UniManager.exe | менеджер файлов подсветки из пакета UniHighlighter | |
rds.jar | сервер ведения отчетов о работе отлаживаемых приложений. Слушает tcp-сокет и выводит во вкладках получаемые строки | |
rds.bat | командный файл для запуска сервера отчетов отладки | |
msc.err | ресурсы строковых сообщений препроцессора | |
help.ini | файл настроек справочной системы IDE. Настраивает меню "Помощь" | |
tools.ini | файл настроек инструментов IDE. Настраивает меню "Инструменты" | |
bin/images | файлы рисунков для конструкторов по шаблонам, интсрументов и справки | |
bin/languages | файлы локализации редактора Mystix | |
devices | тут хранятся библиотеки устройств | |
include | содержит заголовочные файлы, подключаемые директивой #include | |
lib | содержит библиотечные файлы для препроцессора, подключаемые директивой #uselibrary | |
samples | несколько примеров проектов | |
sсripts | содержит pascal-скрипты компиляторов под различные платформы | |
blackberry_win32.pas | компилятор приложений BlackBerry | |
j2me_win32.pas | компилятор мидлетов j2me | |
j2se_win32.pas | компилятор приложений и апплетов j2se | |
mc8051.pas | компиялтор под микроконтроллеры серии MSC51 | |
web_html_win32.pas | компилятор для препроцессинга html-сайтов | |
tools | содержит инструменты сторонних разработчиков | |
calc.* | простой и удобный калькулятор программиста | |
pngout.exe | утилита для уменьшения размеров png-файлов | |
tools/asem51 | компилятор ассемблера для микроконтроллеров серии MSC51 | |
tools/emul8051 | эмулятор для микроконтроллеров серии MSC51 | |
tools/jsim | еще один эмулятор MSC51 | |
xml | содержит файлы конфигурации | |
xml/devices | содержит файлы описания устройств | |
xml/highlighters | описания подсветок редактора для разных типов файлов в формате UniHighlighter | |
xml/paths | определения путей к используемым программам, библиотекам и заголовочным файлам | |
xml/platforms | описания платформ для сборки. Платформа определяется набором макроконстант и скриптом компиляции | |
xml/system | файлы описания синтаксиса и определения значений по умолчанию для всех остальных файлов конфигурации | |
xml/templates | описания шаблонов для создания файлов и проектов |