90 年代初頭にライセンスを取得したこの C プログラムの小さなセクションを変更するための助けが必要です。ご存知の方もいらっしゃるかもしれませんが、これは MajorBBS と呼ばれ、おそらく bbs ソフトウェアであると推測されます。
ヘッダー ファイル majorbbs.h には、
extern
struct module { /* module interface block */
char descrp[MNMSIZ]; /* description for main menu */
int (*lonrou)(); /* user logon supplemental routine */
int (*sttrou)(); /* input routine if selected */
void (*stsrou)(); /* status-input routine if selected */
int (*injrou)(); /* "injoth" routine for this module */
int (*lofrou)(); /* user logoff supplemental routine */
void (*huprou)(); /* hangup (lost carrier) routine */
void (*mcurou)(); /* midnight cleanup routine */
void (*dlarou)(); /* delete-account routine */
void (*finrou)(); /* finish-up (sys shutdown) routine */
} **module;
また、majorbbs.h には、メニュー変数を定義するコードがいくつかあります。
extern
struct usrmnu { /* user's menuing-specific variables */
char curpag[PNMSIZ]; /* current menu page */
char parpag[PNMSIZ]; /* parent menu page */
char selchrs[MAXSEL]; /* select characters currently available */
char pages[MAXSEL][PNMSIZ]; /* pages or file names for select chars */
char optdsp[MAXSEL]; /* instructions on how to display options */
int keyreq[MAXSEL]; /* key required for each select character */
FILE *fp; /* pointer to file currently being viewed */
char mnuttl[TITLSZ]; /* menu page title */
} *mnuusr;
次に、majorbbs.c ファイルに
struct module module00={ /* module interface block */
"Menuing System", /* description for main menu */
NULL, /* user logon supplemental routine */
mainu, /* input routine if selected */
musthn, /* status-input routine if selected */
NULL, /* "injoth" routine for this module */
NULL, /* user logoff supplemental routine */
loscar, /* hangup (lost carrier) routine */
midnit, /* midnight cleanup routine */
NULL, /* delete-account routine */
mjrfin /* finish-up (sys shutdown) routine */
};
私が望むのは、ここで「Menuing System」として定義されている descrp の値を、ユーザーが現在使用しているメニューのようなより動的なものに変更することです。
ここのコードから、ポインターが指している場所は mnuusr->curpag になると思います。
というわけでルーティーンを考えています。私は決してプログラマーではなく、そのようなことを行う方法の例を探すために多くのサイトに行ってきました。ここ数日間(これを投稿する前に)ここで検索しました。「ちょっとこれはうまくいくかもしれない」というきっかけになったものをいくつか見ましたが、コンパイルエラーが発生しました(これについては後で詳しく説明します)
私がしたことは、次のようなルーチンを作成することでした
char *
mydescrp
{
if (strcmp(module00.descrp,"Menuing System" ) == 0 ) {
mnuusr=mnuoff(usrnum);
return(mnuusr->mnuttl);
}
}
次に、上記の module00 呼び出しを次のように変更すると、
struct module module00={
mydescrp, /* My change */
NULL,
mainu,
musthn,
NULL,
NULL,
loscar,
midnit,
NULL,
mjrfin
};
コンパイルすると、次のようなエラーが表示されます。
完全に括弧で囲まれていない初期化
リストはそこから続きます。後でmajorbbs.cにさらに初期化がいくつかあり、必要に応じて喜んで提供します。私は1つになると確信しています。
int
register_module( /* register a module for online use */
struct module *mod) /* pointer to a module block */
{
if (strlen(mod->descrp) > MNMSIZ-1) {
catastro("MODULE NAME \"%s\" TOO LONG!",mod->descrp);
}
if (mod->stsrou == NULL) {
mod->stsrou=dfsthn;
}
if (nmods == 0) {
module=(struct module **)alcmem(sizeof(struct module *));
mdstats=(struct mdstats *)alcmem(sizeof(struct mdstats));
}
else {
module=(struct module **)alcrsz(module,sizeof(struct module *)*nmods,
sizeof(struct module *)*(nmods+1));
mdstats=(struct mdstats *)alcrsz(mdstats,sizeof(struct mdstats)*nmods,
sizeof(struct mdstats)*(nmods+1));
}
module[nmods]=mod;
setbtv(mstbb);
if (qeqbtv(mod->descrp,0)) {
gcrbtv(&mdstats[nmods],0);
}
else {
setmem(&mdstats[nmods],sizeof(struct mdstats),0);
strcpy(mdstats[nmods].mdname,mod->descrp);
}
rstbtv();
return(nmods++);
}
MENUING.C mnuoff ルーチンから
struct usrmnu *
mnuoff( /* get pointer to user's menu info */
int unum) /* user number to grab */
{
#ifdef PHARLAP
return((struct usrmnu *)((long)(eclmnubas+(unum<<3))<<16));
#else
#ifdef ECLIPSE
return((struct usrmnu *)((long)(eclmnubas+(unum<<3))<<16));
#else
return((struct usrmnu *)(muusrs+(unum*(long)sizeof(struct usrmnu))));
#endif
#endif
}
これは、いくつかの新しいコードのために変更するルーチンですか? 私はこれについてどうやって行くのか途方に暮れています。さらにコードが必要な場合はお知らせください。
私は usenet で他の majorbbs プログラマーに助けを求めることさえしましたが、このソフトウェアは 20 年以上前のものなので、コードを変更するどころか、もう誰も使用していないと思います。まだCなので、誰かが私を助けるアイデアを持っているかもしれないと思います。いくつかの小さな変更を加えて、新しいリバイブを作成しようとしています。これは2つのうちの1つです。
助けてくれてありがとう。