summaryrefslogtreecommitdiffstats
path: root/util/boardlist.c
diff options
context:
space:
mode:
Diffstat (limited to 'util/boardlist.c')
-rw-r--r--util/boardlist.c105
1 files changed, 105 insertions, 0 deletions
diff --git a/util/boardlist.c b/util/boardlist.c
new file mode 100644
index 00000000..b28b2b03
--- /dev/null
+++ b/util/boardlist.c
@@ -0,0 +1,105 @@
+/* $Id: boardlist.c,v 1.1 2003/07/11 09:02:40 in2 Exp $ */
+#include "bbs.h"
+
+static void
+load_uidofgid(const int gid, const int type)
+{
+ boardheader_t *bptr, *currbptr;
+ int n, childcount = 0;
+ currbptr = &bcache[gid - 1];
+ for (n = 0; n < numboards; ++n) {
+ bptr = SHM->bsorted[type][n];
+ if (bptr->brdname[0] == '\0')
+ continue;
+ if (bptr->gid == gid) {
+ if (currbptr == &bcache[gid - 1])
+ currbptr->firstchild[type] = bptr;
+ else {
+ currbptr->next[type] = bptr;
+ currbptr->parent = &bcache[gid - 1];
+ }
+ childcount++;
+ currbptr = bptr;
+ }
+ }
+ bcache[gid - 1].childcount = childcount;
+ if (currbptr == &bcache[gid - 1])
+ currbptr->firstchild[type] = (boardheader_t *) ~ 0;
+ else
+ currbptr->next[type] = (boardheader_t *) ~ 0;
+}
+
+char *skipEscape(char *s)
+{
+ static char buf[TTLEN * 2 + 1];
+ int r, w;
+ for( w = r = 0 ; s[r] != 0 ; ++r ){
+ if( s[r] == '\'' || s[r] == '\\' )
+ buf[w++] = '\\';
+ buf[w++] = s[r];
+ }
+ buf[w++] = 0;
+ return buf;
+}
+
+void dumpclass(int bid)
+{
+ boardheader_t *bptr;
+ int r, w;
+ bptr = &bcache[bid];
+ if (bptr->firstchild[0] == NULL || bptr->childcount <= 0)
+ load_uidofgid(bid + 1, 0); /* 因為這邊 bid從 0開始, 所以再 +1 回來 */
+ printf(" %5d => [\n", bid);
+ for (bptr = bptr->firstchild[0]; bptr != (boardheader_t *) ~ 0;
+ bptr = bptr->next[0]) {
+ if( (bptr->brdattr & (BRD_HIDE | BRD_TOP)) ||
+ (bptr->level && !(bptr->brdattr & BRD_POSTMASK) &&
+ (bptr->level &
+ ~(PERM_BASIC|PERM_CHAT|PERM_PAGE|PERM_POST|PERM_LOGINOK))) )
+ continue;
+
+ printf(" [%5d, '%s', '%s'], \n",
+ (bptr->brdattr & BRD_GROUPBOARD) ? bptr - bcache : -1,
+ bptr->brdname, skipEscape(&bptr->title[7]));
+ }
+ printf(" ],\n");
+
+ bptr = &bcache[bid];
+ for (bptr = bptr->firstchild[0]; bptr != (boardheader_t *) ~ 0;
+ bptr = bptr->next[0]) {
+ if( (bptr->brdattr & (BRD_HIDE | BRD_TOP)) ||
+ (bptr->level && !(bptr->brdattr & BRD_POSTMASK) &&
+ (bptr->level &
+ ~(PERM_BASIC|PERM_CHAT|PERM_PAGE|PERM_POST|PERM_LOGINOK))) )
+ continue;
+
+ printf(" '%d.title' => '%s',\n",
+ bptr - bcache, skipEscape(&bptr->title[7]));
+ if( bptr->brdattr & BRD_GROUPBOARD )
+ dumpclass(bptr - bcache);
+ }
+}
+
+int main(int argc, char **argv)
+{
+ attach_SHM();
+
+ printf("# this is auto-generated perl module from boardlist.c\n"
+ "# please do NOT modify this directly\n"
+ "\n"
+ "package boardlist;\n"
+ "require 5.6;\n"
+ "use Exporter;\n"
+ "$VERSION = '0.1';\n"
+ "use vars qw(%%brd);\n"
+ "\n"
+ "%%brd = (\n");
+ dumpclass(0);
+ printf(");\n"
+ "our(@ISA, @EXPORT);\n"
+ "@ISA = qw(Exporter);\n"
+ "@EXPORT = qw(%%brd);\n"
+ "\n"
+ "1;\n");
+ return 0;
+}