Генератор
Проектов

Проект pkgprocfunc

Проект демонстрирует использование процедур и функций в отдельном пакете.

За основу взят проект procfunc, но декларация типов и процедур из утилиты выделена в отдельный пакет pkgprc. Пакет декларирован в главном файле pkgprocfunc.gen с ключевым словом package. Таким образом в данном проекте есть два проектных пакета: package pkgprc и utility pkgprocfunc. Порядок перечисления проектных пакетов в gen-файле важен, любой пакет должен быть описан перед его использованием.

В пакете типа package (как и во многих других) есть заголовок с возможными опциями, раздел внешних спецификаций и раздел реализации. Внешние спецификации и реализация отделяются ключевым словом implementation.

Внешние типы (описанные во внешних спецификациях) описываются так же, как и внутри пакета, т.е. после implementation или в пакете типа utility.

Отметим здесь, что утилита есть пример так называемого топового пакета, которому соответствует исполняемый файл (или динамическая библиотека для некоторых других типов топовых пакетов). У утилиты нет внешних спецификаций, все типы и процедуры в ней считаются внутренними, как будто после слова implementation, которое в утилите не нужно.

В отличие от типов внешние процедуры и функции декларируются в разделе спецификаций только заголовками и с ключевыми словами funcdecl, fprocdecl, procdecl, а вместо тела процедуры ставится точка с запятой. Для каждой такой декларации внешней процедуры или функции в разделе реализации должна быть описана в точности такая же процедура (или функция) с идентичными заголовком и телом в виде блока.

В разделе реализации можно описывать внутренние типы и процедуры (функции), но они будут доступны только в данном пакете.

Как внешние, так и внутренние объекты (типы, процедуры, функции) внутри данного пакета вызываются по имени объекта. В других пакетах эти имена должны предваряться именем пакета и точкой. Так в утилите тип t_char8 из пакета pkgprc в описниии переменных используется в виде pkgprc.t_char8. Аналогично процедура error_if_empty из пакета pkgprc вызывается как pkgprc.error_if_empty.

Производится проверка используемости объектов, как внутренних, так и внешних. Используемость внутренних объектов проверяется при обработке пакета. Используемость внешних объектов пакета проверяется только при полной генерации проекта.

Файл pkgprocfunc.gen:

project pkgprocfunc
  /version="01.001"
  /firm="УСТ"
  /http="http://www.ustech.ru"
  /email="managers@ustech.ru"

package pkgprc

utility pkgprocfunc

Файл pkgprc.package:

package pkgprc

type t_char7 : char7[100];
type t_char8 : char8[100];
type t_chara : chara[100];
type t_char16 : char16[100];
type t_charw : charw[100];

funcdecl is_empty:bool(string8 s8);
fprocdecl check_empty(string8 s8,t_char8 c8);
procdecl error_if_empty(string8 s8,t_char8 c8);

implementation

funcdecl is_empty:bool(string8 s8)
{ return s8 = U"";
}

fprocdecl check_empty(string8 s8,t_char8 c8)
{ if ( not is_empty(s8) )
    dprint("s8 is not empty\n");

  if ( not is_empty(c8) )
    dprint("c8 is not empty\n");
}

type t_int : int;

func length:t_int(string8 s8,t_char8 c8)
{ return gstring.bytes(s8)+gstring.bytes(c8);
}

procdecl error_if_empty(string8 s8,t_char8 c8)
{ if ( is_empty(s8) )
    error "s8 is empty";

  if ( is_empty(c8) )
    error "c8 is empty";

  var
    t_int cnt := length(s8,c8);

  if ( cnt > 120 )
    error "too long values";
}

Файл pkgprocfunc.utility:

utility pkgprocfunc:"PROC FUNC package examples"

main
{ var
    pkgprc.t_char7 c7 := "7-bit char litaral",
    pkgprc.t_char8 c8 := U"Алфавит - alphabet - αλφάβητο UTF-8",
    pkgprc.t_chara ca := A"Кириллица",
    pkgprc.t_char16 c16 := H"Алфавит - alphabet - αλφάβητο UTF-16",
    pkgprc.t_charw cw := W"Алфавит - alphabet - αλφάβητο UNICODE";

  dprint("c7: ",c7,"\n");
  dprint("c8: ",c8,"\n");
  dprint("ca: ",ca,"\n");
  dprint("c16: ",c16,"\n");
  dprint("cw: ",cw,"\n");
  if ( not pkgprc.is_empty(c8) )
    dprint("c8 is not empty\n");

  if ( not pkgprc.is_empty(c7) )
    dprint("c7 is not empty\n");

  call pkgprc.check_empty(c8,c8);
  pkgprc.check_empty(c8,c8);
  call pkgprc.error_if_empty(c8,c8);
  pkgprc.error_if_empty(c8,c8);

  { var
      errfun.t_mess err;

    pkgprc.error_if_empty(c8,c8) error err;
    if ( err <> "" )
      dprint("error_if_empty: ",err,"\n");
  }
}
Скачать проект pkgprocfunc