template_insert()

perlからは「template_insert()」が呼び出される。MTemplate.xsでは、

SV* template_insert(char* file, SV* rHash, SV* rHash2, SV* rHash3);

と定義されている。第一引数はテンプレートファイルのパス。第二〜第四引数がテンプレートの引数。

この関数では、まずはじめに、テンプレートファイルを開く。ここで用いられるのがmmap
実際には、mmap_file()という関数が呼び出される。この関数内でmmapシステムコールが呼び出され、テンプレートファイルの中身を読み込む。

int mmap_file(char* file, char** buf) {
   int len;
   size_t l;
   FILE* fd;

   //バイナリモードでファイルオープン
   fd = fopen(file, "rb");
   if (fd == NULL) return(0);

   //ファイルサイズ取得
   fseek(fd, 0, SEEK_END);
   len = ftell(fd);
   fseek(fd, 0, SEEK_SET);

   //mmapシステムコールを呼び出し
   *buf = (char*) mmap(0, len, PROT_READ, MAP_SHARED, fileno(fd), 0);
   fclose(fd);
   return(len);
}

テンプレートファイルを読み込んだ後は、SvRVでテンプレートの引数のHVポインタを得る。

pHash = (HV*) SvRV(rHash);

ここらへん、具体的になにやってんのかよく分からない。
この後、テンプレートファイルを解析していく「template_process()」を呼び出す。

template_process(svHtml, pLines, pString, pHash, pHash2, pHash3, pLines);

//svHtml:出力用
//pLines:テンプレートHTML部の先頭を指している
//pString:テンプレートHTML部の末尾を指している
//pHash, pHash2, pHash3:テンプレート引数
//ptr:テンプレート読み込み部を指しているポインタ