#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "res.h"
#include "abuff.h"

int NamesTResource(TRES *tres,unchar *(*work))
/* そのリソースファイル内のすべてのリソース名を読み出す */
/* その結果は、ワークエリアを確保してそこに格納する */
/* ワークエリア内容はstrcut()で分割取得できる */
/* リターン値	＞０：名前の数 */
/*		-２：リソース構造がおかしい */
/*		-３：リソースが読めない */
/*		-４：メモリーが確保できない */
{
unchar line[TRESMAX],token[TRESMAX],token2[TRESMAX];
unchar *wk;
int cn,sz,pt,len;
int names;
	/* とりあえずワークエリア確保 */
	wk=newmalloc(TRESWRK);
	if (wk==NULL) return(-4); /* メモリーが確保できない */
	sz=TRESWRK;	/* 現バッファーの残りサイズ */
	pt=0;		/* 次の書き込みポイント */
	names=0;	/* リソース名数 */
	
	/* 常に先頭からサーチ */
	fseek(tres->fp,tres->top,SEEK_SET);
	while (read1line0(tres->fp,line,token,TRESMAX)==0) {
	    if (token[0]=='*') { /* リソースシンボル */
		/* リソース名はtoken[1]から */
		len=strlen(&token[1])+1; /* +1 for EOS */
		sz-=len;
		if (sz<0) { /* ワークエリアが足りない */
			wk=realloc(wk,TRESWRK);
			if (wk==NULL) { /* メモリーが確保できない */
				free(wk); /* 元のワークも解放する */
				return(-4);
			}
			sz+=TRESWRK;
		}
		strcpy(&wk[pt],&token[1]);
		pt+=len;
		names++;
		/* 次のリソースまで飛ばす */
		cn=0; /* '{'の数 */
		do {
		    	if (read1line0(tres->fp,line,token2,TRESMAX)) return(-3); /* リソースが読めない */
		    	if (strcmp(token2,"{")==0) cn++;
		    	if (strcmp(token2,"}")==0) cn--;
		} while (cn>0);
	    }
	}
	/* 本当に必要なサイズにワークエリアを縮小する・・・ことはしない */
	/* ここまで動いているのに、ここでメモリー確保エラーが出るとあほらしいから */
	if (pt==0) { /* リソース名が１つもない */
		free(wk);
		return(-2);
	}
	/* 最後はEOS:EOS */
	wk[pt]=0;
	*work=wk;
	return(names);
}
