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:テンプレート読み込み部を指しているポインタ