 
        BRC (v2) documentation by scw   08/05/2003
					06/12/2007 revised by kcwu
					12/02/2007 v3 by piaip
 
_G
     og峹DnO brc_* 禡Aoը禡O pttbbs ΨӬ峹wŪ/Ū
 uA]xs覡Q tricky saϪe۷CF{έץ
 䤤@ bugA̦˲MF䤤B@覡Aì伶gAƱ޲z̦
 UC
 
HӬݳog峹H
     1. pttbbs tκ޲z̡CpGznoiקΧΡAƱog峹
        zҧUqC
     2. Qnsoإη֪ŶOUjTkHC
 
BRC OHpB@H
     brc_* Owqb pttbbs/mbbsd/board.c @ը禡Atd峹wŪ/ŪA
 SIOΪŶ֡CiHb 24k HŶOU@ӤHb峹wŪ/
 ŪCMAo˪kiuAOϥΤWwgFC򻡬O
 OHoxs覡C
     ɦb home/[first charactor of id]/[id]/.brc2Cɮ׮榡pUG
 
 FILE     := RECORDS ;
 RECORDS  := RECORDS RECORD | ;
 RECORD   := BRC_BID BRC_DATA ;
 BRC_DATA := BRC_NUM BRC_LIST ;
 BRC_LIST := NUM NUM ... NUM ;  (@ BRC_NUM  NUM)
 BRC_BID O board bid, sizeof(brcbid_t)=2 bytes.
 BRC_NUM    OoӪOxsqAsizeof(brcnbrd_t)=2 bytes H binary 覡xsA
             <= MAX_NUM (80)
 BRC_LIST   OoӪOAn BRC_NUM  sizeof(time4_t)=4 bytes integers
 t~b 24576 bytes (#define BRC_MAXSIZE 24576) ~Ƥ|QΨC
 
     bU|ݨABRC_BID  BRC_NUM  BRC_LIST |bܼƤ,
 brc_currbid & brc_num & brc_list C

     Pw@ɮ׬O_wgŪLkOb brc_list jMɮ׫إߪɶA]NO
 ɦW M.xxxxxxxxxx.A.yyy  xxxxxxxxx ӼƦrCpGoӼƦrb brc_list 
 X{NOwŪAnpG brc_list ҦƦroɮתإ߮ɶj]]NO
 oɮתإ߮ɶbҦ brc_list ɶIe^]OwŪA̫ᬰF`٪Ŷ
 ٦@ӧPw]oӧPwOĤ@Ӱ^ApGɮ׫إ߮ɶb login ɶ@~
 eA@߬OwŪC
     o˥iHݥXoӤkOuOwgC]TӡG
 A brc_num <= 80 ]NO brc_list ̦hsKQӼơAoܰFܤ[He峹
 ~Au|KQgOwŪCĤGNOҦ@~e峹|QPwŪC̫ApG@
 ӤHݪOӦhA .brc2 jpWL BRC_MAXSIZE ǪON|] 24576
 bytes ̤֥iHs 73 ӪOơAo٬OΥO brc_num O 80 p⪺^Co
 TӤpIvTӤjaH

v3 

     Dec 2007 }l ptt brc ޤJ v3 榡APeOۮeCҿת v3 Oѩ BBS
 uvtγQݥΦӲͪݨDC媺ΦOb[s@A
 BRC tεLk릹ʡFYQHO_sUa@k@A`O
  edit_post ɮקWCoؤ覡FĲv~A٦ëDCӤHQݷs
 DC
     Ҷq\[Aq BRC U٬OѡC bC BRC OWhsW@ modified
 time YiC kiPɾAΩɮ׻P[tΡCNO BRC jp
 [ALoGOjDC
     ѩ v2 v3 ڮtäjAo̪OdH v2 DC ·Цۤvd svn
 ND v3 FFC

 - ptt2  brc V3 eiA MAX_BOARD FW (42000)AQ׫MwK brc V3
 ]p brcbid_t = int32C

 
BRC v2 @
 
 interface: (in proto.h)
 
  int brc_initialize();
  void brc_finalize();

  int brc_unread(int bid, char *fname, int bnum, int *blist);
      P_@g峹O_wŪC
      ǤJȡG峹ɦW (fname) H brc_num (bnum) M brc_list (blist)C
      Ǧ^ȡGpG bnum M blist P_g峹ŪǦ^ 1C
              _hǦ^ 0C
      B~ĪGGLC
  
  int brc_initial_board(char *boardname);
      lƦb@ӪOwŪŪAC
      ǤJȡGnlƪOWC
      Ǧ^ȡGY줧eǦ^s brc_numA_hǦ^ 0C
      B~ĪGGpGǤJݪONOثeݪO|Ǧ^ brc_num, OơC_h
      禡|Nثe brc data g^ brc_buf A currboard Ao
      currbid M currbrdattr AŪçs brc_num  brc_listCpGbϥΪ
       brc_buf SoӪOA|]w brc_num = 1Abrc_list[0] = 1
      öǦ^ 0C
  
  void brc_update();
      Nثe brc data gJ brc_buf C
      B~ĪGGpG brc data QΨϥΪvh|ʧ@C
  
  void brc_addlist(char *fname);
      N峹ХܬwŪCϥΫeݥ brc_initial_board()
      ǤJȡGnХܬwŪ峹ɦWC
  
 constant definition:
  
  #define BRC_MAXSIZE     24576
      .brc2 ĤjpC
  
  #define BRC_MAXNUM      80
      brc_num ̤jȡC
  
 private variables: (in board.c)
  
  static time_t brc_expire_time;
      brc_list ȪUAɶbe@߷@wŪC|b init_brdbuf Q]
      w login_start_time - 365 * 86400C
  
  static char   brc_buf[BRC_MAXSIZE];
      Is read_brc_buf  .brc2 e BRC_MAXSIZE bytes |QmJo buffer C

  static int    brc_size;
      Is read_brc_buf  brc_buf ĦrơC

  static int    brc_changed = 0;
      qWŪ .brc2 ɬAbrc_num P brc_list O_ܹLC

  static int    brc_currbid;

  static int    brc_num;
      brc_list ļƦrӼơC

  static int    brc_list[BRC_MAXNUM];
      wŪ峹sɮɶC
  

  static void read_brc_buf();
      q .brc2 Ū̦h BRC_MAXSIZE bytes æsJ brc_buf ANsJr
      Ʀsb brc_size C

  static char * brc_putrecord(char *ptr, char *endp, brcbid_t bid,
                              brcnbrd_t num, const time4_t *list);
      P brc_getrecord() @ΥnۤϡANƼgJ puffer C
      ǤJȡGptr VngJ bufferAbid, num, list OOngJơC
      Ǧ^ȡGVgJ record U@ӦrСC
      B~ĪGGYƬOXk (num > 0 && list[0] > brc_expire_time) BŶ
      , Ʒ|QgJ ptr, endp C

  static int brc_unread_time(time_t ftime, int bnum, int *blist);
       brc_unread() AuOǤJOɮ׫إߪɶC
      ǤJȡG峹إ߮ɶ (ftime)  brc_num (bnum) M brc_list (blist)C
      Ǧ^ȡGpG bnum M blist P_g峹ŪǦ^ 1C
              _hǦ^ 0C
