//  This may look like C code, but it is really -*- C++ -*-

//  ------------------------------------------------------------------
//  The Goldware Library
//  Copyright (C) 1990-1999 Odinn Sorensen
//  Copyright (C) 1999-2000 Alexander S. Aganichev
//  ------------------------------------------------------------------
//  This library is free software; you can redistribute it and/or
//  modify it under the terms of the GNU Library General Public
//  License as published by the Free Software Foundation; either
//  version 2 of the License, or (at your option) any later version.
//
//  This library is distributed in the hope that it will be useful,
//  but WITHOUT ANY WARRANTY; without even the implied warranty of
//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
//  Library General Public License for more details.
//
//  You should have received a copy of the GNU Library General Public
//  License along with this program; if not, write to the Free
//  Software Foundation, Inc., 59 Temple Place, Suite 330, Boston,
//  MA 02111-1307, USA
//  ------------------------------------------------------------------
//  $Id: gmsgattr.h,v 1.4 2001/12/17 15:44:55 asa Exp $
//  ------------------------------------------------------------------
//  Message attributes.
//  ------------------------------------------------------------------

#ifndef __gmsgattr_h
#define __gmsgattr_h


//  ------------------------------------------------------------------

#include <string>
#include <gdefs.h>
#include <gstrall.h>


//  ------------------------------------------------------------------
//  Internal GoldED message attributes

const ulong GATTR_PVT = 0x00000001UL;  // private
const ulong GATTR_CRA = 0x00000002UL;  // crash
const ulong GATTR_RCV = 0x00000004UL;  // received
const ulong GATTR_SNT = 0x00000008UL;  // sent

const ulong GATTR_ATT = 0x00000010UL;  // file attach
const ulong GATTR_TRS = 0x00000020UL;  // transit
const ulong GATTR_ORP = 0x00000040UL;  // orphaned
const ulong GATTR_K_S = 0x00000080UL;  // kill msg when sent

const ulong GATTR_LOC = 0x00000100UL;  // local
const ulong GATTR_HLD = 0x00000200UL;  // hold
const ulong GATTR_RSV = 0x00000400UL;  // FTS-1 reserved
const ulong GATTR_FRQ = 0x00000800UL;  // file request

const ulong GATTR_RRQ = 0x00001000UL;  // return receipt request
const ulong GATTR_RRC = 0x00002000UL;  // return receipt
const ulong GATTR_ARQ = 0x00004000UL;  // audit request
const ulong GATTR_URQ = 0x00008000UL;  // file update request

const ulong GATTR_GRP = 0x00010000UL;  // group msg (hudson)
const ulong GATTR_IMM = 0x00020000UL;  // immediate
const ulong GATTR_DIR = 0x00040000UL;  // direct
const ulong GATTR_TFS = 0x00080000UL;  // truncate file when sent

const ulong GATTR_KFS = 0x00100000UL;  // kill file when sent
const ulong GATTR_LOK = 0x00200000UL;  // locked
const ulong GATTR_A_S = 0x00400000UL;  // archive msg when sent
const ulong GATTR_ZON = 0x00800000UL;  // send through zone gate

const ulong GATTR_HUB = 0x01000000UL;  // host- or hub route
const ulong GATTR_XMA = 0x02000000UL;  // xmail: alternate form of compressed mail attached
const ulong GATTR_CFM = 0x04000000UL;  // confirmation receipt requested
const ulong GATTR_HIR = 0x08000000UL;  // fax: hi-resolution image

const ulong GATTR_COV = 0x10000000UL;  // fax: cover sheet
const ulong GATTR_SIG = 0x20000000UL;  // fax: signature
const ulong GATTR_LET = 0x40000000UL;  // fax: letterhead
const ulong GATTR_UNS = 0x80000000UL;  // unsent - not scanned (internal)

const ulong GATTR_DEL = 0x00000001UL;  // deleted
const ulong GATTR_NWM = 0x00000002UL;  // new message (internal)
const ulong GATTR_ROT = 0x00000004UL;  // rot-13 encoded (internal)
const ulong GATTR_HEX = 0x00000008UL;  // hexdump (internal)

const ulong GATTR_UPD = 0x00000010UL;  // update *.msg time stamp (internal)
const ulong GATTR_TOU = 0x00000020UL;  // to-you (internal)
const ulong GATTR_FMU = 0x00000040UL;  // from-you (internal)
const ulong GATTR_SCN = 0x00000080UL;  // scanned (squish)

const ulong GATTR_POS = 0x00000100UL;  // set line position (internal)
const ulong GATTR_R_O = 0x00000200UL;  // area read-only
const ulong GATTR_NOK = 0x00000400UL;  // (not used)
const ulong GATTR_FAX = 0x00000800UL;  // file attached is a fax image

const ulong GATTR_PRN = 0x00001000UL;  // message is printed (squish)
const ulong GATTR_ANO = 0x00002000UL;  // anonymous
const ulong GATTR_UME = 0x00004000UL;  // unmoved echo message (adeptxbbs)
const ulong GATTR_UMN = 0x00008000UL;  // unmoved net message (adeptxbbs)

const ulong GATTR_FSC = 0x00010000UL;  // fidonet scanned (adeptxbbs)
const ulong GATTR_GSC = 0x00020000UL;  // groupmail scanned (adeptxbbs)
const ulong GATTR_RSC = 0x00040000UL;  // rfc822 scanned (adeptxbbs)
const ulong GATTR_TRT = 0x00080000UL;  // treated: soft cr's & lf's removed (adeptxbbs)

const ulong GATTR_LZS = 0x00100000UL;  // msg is lzss compressed (adeptxbbs)
const ulong GATTR_ARC = 0x00200000UL;  // message is stored (adeptxbbs)
const ulong GATTR_TAG = 0x00400000UL;  // tagged: used by offline readers (adeptxbbs & wildcat)
const ulong GATTR_RAB = 0x00800000UL;  // receivable (wildcat)

const ulong GATTR_CAR = 0x01000000UL;  // carboned (wildcat)
const ulong GATTR_FWD = 0x02000000UL;  // forwarded (wildcat)
const ulong GATTR_EFL = 0x04000000UL;  // echoflag (wildcat)
const ulong GATTR_HRP = 0x08000000UL;  // has replies (wildcat)

const ulong GATTR_PKD = 0x10000000UL;  // Archived

class ftn_attr {

protected:

  ulong attr1, attr2;

public:

  ftn_attr() { reset(); }
  ftn_attr(const char* s) { get(s); }
  ftn_attr(const std::string& s) { get(s); }
  ftn_attr(const ftn_attr& o) { operator=(o); }

  void reset() { attr1 = attr2 = 0; }

  void add(const ftn_attr& b);
  void get(const std::string& s);
  std::string& make_string(std::string& s) const;

  bool equals(const ftn_attr& b) const;

  ftn_attr& operator=(const char* s)      { get(s); return *this; }
  ftn_attr& operator=(const std::string& s)   { get(s); return *this; }
  ftn_attr& operator=(const ftn_attr& o)  { attr1=o.attr1; attr2=o.attr2; return *this; }

  bool operator==(const ftn_attr& b) const  { return equals(b); }
  bool operator!=(const ftn_attr& b) const  { return !equals(b); }

  //  ----------------------------------------------------------------

  int pvt() const  { return (attr1 & GATTR_PVT) != 0; }
  int cra() const  { return (attr1 & GATTR_CRA) != 0; }
  int rcv() const  { return (attr1 & GATTR_RCV) != 0; }
  int snt() const  { return (attr1 & GATTR_SNT) != 0; }

  int att() const  { return (attr1 & GATTR_ATT) != 0; }
  int trs() const  { return (attr1 & GATTR_TRS) != 0; }
  int orp() const  { return (attr1 & GATTR_ORP) != 0; }
  int k_s() const  { return (attr1 & GATTR_K_S) != 0; }

  int loc() const  { return (attr1 & GATTR_LOC) != 0; }
  int hld() const  { return (attr1 & GATTR_HLD) != 0; }
  int rsv() const  { return (attr1 & GATTR_RSV) != 0; }
  int frq() const  { return (attr1 & GATTR_FRQ) != 0; }

  int rrq() const  { return (attr1 & GATTR_RRQ) != 0; }
  int rrc() const  { return (attr1 & GATTR_RRC) != 0; }
  int arq() const  { return (attr1 & GATTR_ARQ) != 0; }
  int urq() const  { return (attr1 & GATTR_URQ) != 0; }

  int grp() const  { return (attr1 & GATTR_GRP) != 0; }
  int imm() const  { return (attr1 & GATTR_IMM) != 0; }
  int dir() const  { return (attr1 & GATTR_DIR) != 0; }
  int tfs() const  { return (attr1 & GATTR_TFS) != 0; }

  int kfs() const  { return (attr1 & GATTR_KFS) != 0; }
  int lok() const  { return (attr1 & GATTR_LOK) != 0; }
  int a_s() const  { return (attr1 & GATTR_A_S) != 0; }
  int zon() const  { return (attr1 & GATTR_ZON) != 0; }

  int hub() const  { return (attr1 & GATTR_HUB) != 0; }
  int xma() const  { return (attr1 & GATTR_XMA) != 0; }
  int cfm() const  { return (attr1 & GATTR_CFM) != 0; }
  int hir() const  { return (attr1 & GATTR_HIR) != 0; }

  int cov() const  { return (attr1 & GATTR_COV) != 0; }
  int sig() const  { return (attr1 & GATTR_SIG) != 0; }
  int let() const  { return (attr1 & GATTR_LET) != 0; }
  int uns() const  { return (attr1 & GATTR_UNS) != 0; }

  int del() const  { return (attr2 & GATTR_DEL) != 0; }
  int nwm() const  { return (attr2 & GATTR_NWM) != 0; }
  int rot() const  { return (attr2 & GATTR_ROT) != 0; }
  int hex() const  { return (attr2 & GATTR_HEX) != 0; }

  int upd() const  { return (attr2 & GATTR_UPD) != 0; }
  int tou() const  { return (attr2 & GATTR_TOU) != 0; }
  int fmu() const  { return (attr2 & GATTR_FMU) != 0; }
  int scn() const  { return (attr2 & GATTR_SCN) != 0; }

  int pos() const  { return (attr2 & GATTR_POS) != 0; }
  int r_o() const  { return (attr2 & GATTR_R_O) != 0; }
  int nok() const  { return (attr2 & GATTR_NOK) != 0; }
  int fax() const  { return (attr2 & GATTR_FAX) != 0; }

  int prn() const  { return (attr2 & GATTR_PRN) != 0; }
  int ano() const  { return (attr2 & GATTR_ANO) != 0; }
  int ume() const  { return (attr2 & GATTR_UME) != 0; }
  int umn() const  { return (attr2 & GATTR_UMN) != 0; }

  int fsc() const  { return (attr2 & GATTR_FSC) != 0; }
  int gsc() const  { return (attr2 & GATTR_GSC) != 0; }
  int rsc() const  { return (attr2 & GATTR_RSC) != 0; }
  int trt() const  { return (attr2 & GATTR_TRT) != 0; }

  int lzs() const  { return (attr2 & GATTR_LZS) != 0; }
  int arc() const  { return (attr2 & GATTR_ARC) != 0; }
  int tag() const  { return (attr2 & GATTR_TAG) != 0; }
  int rab() const  { return (attr2 & GATTR_RAB) != 0; }

  int car() const  { return (attr2 & GATTR_CAR) != 0; }
  int fwd() const  { return (attr2 & GATTR_FWD) != 0; }
  int efl() const  { return (attr2 & GATTR_EFL) != 0; }
  int hrp() const  { return (attr2 & GATTR_HRP) != 0; }

  int pkd() const  { return (attr2 & GATTR_PKD) != 0; }

  //  ----------------------------------------------------------------

  void pvt(ulong x)  { if(x) attr1 |= GATTR_PVT; else attr1 &= ~GATTR_PVT; }
  void cra(ulong x)  { if(x) attr1 |= GATTR_CRA; else attr1 &= ~GATTR_CRA; }
  void rcv(ulong x)  { if(x) attr1 |= GATTR_RCV; else attr1 &= ~GATTR_RCV; }
  void snt(ulong x)  { if(x) attr1 |= GATTR_SNT; else attr1 &= ~GATTR_SNT; }

  void att(ulong x)  { if(x) attr1 |= GATTR_ATT; else attr1 &= ~GATTR_ATT; }
  void trs(ulong x)  { if(x) attr1 |= GATTR_TRS; else attr1 &= ~GATTR_TRS; }
  void orp(ulong x)  { if(x) attr1 |= GATTR_ORP; else attr1 &= ~GATTR_ORP; }
  void k_s(ulong x)  { if(x) attr1 |= GATTR_K_S; else attr1 &= ~GATTR_K_S; }

  void loc(ulong x)  { if(x) attr1 |= GATTR_LOC; else attr1 &= ~GATTR_LOC; }
  void hld(ulong x)  { if(x) attr1 |= GATTR_HLD; else attr1 &= ~GATTR_HLD; }
  void rsv(ulong x)  { if(x) attr1 |= GATTR_RSV; else attr1 &= ~GATTR_RSV; }
  void frq(ulong x)  { if(x) attr1 |= GATTR_FRQ; else attr1 &= ~GATTR_FRQ; }

  void rrq(ulong x)  { if(x) attr1 |= GATTR_RRQ; else attr1 &= ~GATTR_RRQ; }
  void rrc(ulong x)  { if(x) attr1 |= GATTR_RRC; else attr1 &= ~GATTR_RRC; }
  void arq(ulong x)  { if(x) attr1 |= GATTR_ARQ; else attr1 &= ~GATTR_ARQ; }
  void urq(ulong x)  { if(x) attr1 |= GATTR_URQ; else attr1 &= ~GATTR_URQ; }

  void grp(ulong x)  { if(x) attr1 |= GATTR_GRP; else attr1 &= ~GATTR_GRP; }
  void imm(ulong x)  { if(x) attr1 |= GATTR_IMM; else attr1 &= ~GATTR_IMM; }
  void dir(ulong x)  { if(x) attr1 |= GATTR_DIR; else attr1 &= ~GATTR_DIR; }
  void tfs(ulong x)  { if(x) attr1 |= GATTR_TFS; else attr1 &= ~GATTR_TFS; }

  void kfs(ulong x)  { if(x) attr1 |= GATTR_KFS; else attr1 &= ~GATTR_KFS; }
  void lok(ulong x)  { if(x) attr1 |= GATTR_LOK; else attr1 &= ~GATTR_LOK; }
  void a_s(ulong x)  { if(x) attr1 |= GATTR_A_S; else attr1 &= ~GATTR_A_S; }
  void zon(ulong x)  { if(x) attr1 |= GATTR_ZON; else attr1 &= ~GATTR_ZON; }

  void hub(ulong x)  { if(x) attr1 |= GATTR_HUB; else attr1 &= ~GATTR_HUB; }
  void xma(ulong x)  { if(x) attr1 |= GATTR_XMA; else attr1 &= ~GATTR_XMA; }
  void cfm(ulong x)  { if(x) attr1 |= GATTR_CFM; else attr1 &= ~GATTR_CFM; }
  void hir(ulong x)  { if(x) attr1 |= GATTR_HIR; else attr1 &= ~GATTR_HIR; }

  void cov(ulong x)  { if(x) attr1 |= GATTR_COV; else attr1 &= ~GATTR_COV; }
  void sig(ulong x)  { if(x) attr1 |= GATTR_SIG; else attr1 &= ~GATTR_SIG; }
  void let(ulong x)  { if(x) attr1 |= GATTR_LET; else attr1 &= ~GATTR_LET; }
  void uns(ulong x)  { if(x) attr1 |= GATTR_UNS; else attr1 &= ~GATTR_UNS; }

  void del(ulong x)  { if(x) attr2 |= GATTR_DEL; else attr2 &= ~GATTR_DEL; }
  void nwm(ulong x)  { if(x) attr2 |= GATTR_NWM; else attr2 &= ~GATTR_NWM; }
  void rot(ulong x)  { if(x) attr2 |= GATTR_ROT; else attr2 &= ~GATTR_ROT; }
  void hex(ulong x)  { if(x) attr2 |= GATTR_HEX; else attr2 &= ~GATTR_HEX; }

  void upd(ulong x)  { if(x) attr2 |= GATTR_UPD; else attr2 &= ~GATTR_UPD; }
  void tou(ulong x)  { if(x) attr2 |= GATTR_TOU; else attr2 &= ~GATTR_TOU; }
  void fmu(ulong x)  { if(x) attr2 |= GATTR_FMU; else attr2 &= ~GATTR_FMU; }
  void scn(ulong x)  { if(x) attr2 |= GATTR_SCN; else attr2 &= ~GATTR_SCN; }

  void pos(ulong x)  { if(x) attr2 |= GATTR_POS; else attr2 &= ~GATTR_POS; }
  void r_o(ulong x)  { if(x) attr2 |= GATTR_R_O; else attr2 &= ~GATTR_R_O; }
  void nok(ulong x)  { if(x) attr2 |= GATTR_NOK; else attr2 &= ~GATTR_NOK; }
  void fax(ulong x)  { if(x) attr2 |= GATTR_FAX; else attr2 &= ~GATTR_FAX; }

  void prn(ulong x)  { if(x) attr2 |= GATTR_PRN; else attr2 &= ~GATTR_PRN; }
  void ano(ulong x)  { if(x) attr2 |= GATTR_ANO; else attr2 &= ~GATTR_ANO; }
  void ume(ulong x)  { if(x) attr2 |= GATTR_UME; else attr2 &= ~GATTR_UME; }
  void umn(ulong x)  { if(x) attr2 |= GATTR_UMN; else attr2 &= ~GATTR_UMN; }

  void fsc(ulong x)  { if(x) attr2 |= GATTR_FSC; else attr2 &= ~GATTR_FSC; }
  void gsc(ulong x)  { if(x) attr2 |= GATTR_GSC; else attr2 &= ~GATTR_GSC; }
  void rsc(ulong x)  { if(x) attr2 |= GATTR_RSC; else attr2 &= ~GATTR_RSC; }
  void trt(ulong x)  { if(x) attr2 |= GATTR_TRT; else attr2 &= ~GATTR_TRT; }

  void lzs(ulong x)  { if(x) attr2 |= GATTR_LZS; else attr2 &= ~GATTR_LZS; }
  void arc(ulong x)  { if(x) attr2 |= GATTR_ARC; else attr2 &= ~GATTR_ARC; }
  void tag(ulong x)  { if(x) attr2 |= GATTR_TAG; else attr2 &= ~GATTR_TAG; }
  void rab(ulong x)  { if(x) attr2 |= GATTR_RAB; else attr2 &= ~GATTR_RAB; }

  void car(ulong x)  { if(x) attr2 |= GATTR_CAR; else attr2 &= ~GATTR_CAR; }
  void fwd(ulong x)  { if(x) attr2 |= GATTR_FWD; else attr2 &= ~GATTR_FWD; }
  void efl(ulong x)  { if(x) attr2 |= GATTR_EFL; else attr2 &= ~GATTR_EFL; }
  void hrp(ulong x)  { if(x) attr2 |= GATTR_HRP; else attr2 &= ~GATTR_HRP; }

  void pkd(ulong x)  { if(x) attr2 |= GATTR_PKD; else attr2 &= ~GATTR_PKD; }

  //  -------------------------------------------------------------

  void pvt0()  { attr1 &= ~GATTR_PVT; }
  void cra0()  { attr1 &= ~GATTR_CRA; }
  void rcv0()  { attr1 &= ~GATTR_RCV; }
  void snt0()  { attr1 &= ~GATTR_SNT; }

  void att0()  { attr1 &= ~GATTR_ATT; }
  void trs0()  { attr1 &= ~GATTR_TRS; }
  void orp0()  { attr1 &= ~GATTR_ORP; }
  void k_s0()  { attr1 &= ~GATTR_K_S; }

  void loc0()  { attr1 &= ~GATTR_LOC; }
  void hld0()  { attr1 &= ~GATTR_HLD; }
  void rsv0()  { attr1 &= ~GATTR_RSV; }
  void frq0()  { attr1 &= ~GATTR_FRQ; }

  void rrq0()  { attr1 &= ~GATTR_RRQ; }
  void rrc0()  { attr1 &= ~GATTR_RRC; }
  void arq0()  { attr1 &= ~GATTR_ARQ; }
  void urq0()  { attr1 &= ~GATTR_URQ; }

  void grp0()  { attr1 &= ~GATTR_GRP; }
  void imm0()  { attr1 &= ~GATTR_IMM; }
  void dir0()  { attr1 &= ~GATTR_DIR; }
  void tfs0()  { attr1 &= ~GATTR_TFS; }

  void kfs0()  { attr1 &= ~GATTR_KFS; }
  void lok0()  { attr1 &= ~GATTR_LOK; }
  void a_s0()  { attr1 &= ~GATTR_A_S; }
  void zon0()  { attr1 &= ~GATTR_ZON; }

  void hub0()  { attr1 &= ~GATTR_HUB; }
  void xma0()  { attr1 &= ~GATTR_XMA; }
  void cfm0()  { attr1 &= ~GATTR_CFM; }
  void hir0()  { attr1 &= ~GATTR_HIR; }

  void cov0()  { attr1 &= ~GATTR_COV; }
  void sig0()  { attr1 &= ~GATTR_SIG; }
  void let0()  { attr1 &= ~GATTR_LET; }
  void uns0()  { attr1 &= ~GATTR_UNS; }

  void del0()  { attr2 &= ~GATTR_DEL; }
  void nwm0()  { attr2 &= ~GATTR_NWM; }
  void rot0()  { attr2 &= ~GATTR_ROT; }
  void hex0()  { attr2 &= ~GATTR_HEX; }

  void upd0()  { attr2 &= ~GATTR_UPD; }
  void tou0()  { attr2 &= ~GATTR_TOU; }
  void fmu0()  { attr2 &= ~GATTR_FMU; }
  void scn0()  { attr2 &= ~GATTR_SCN; }

  void pos0()  { attr2 &= ~GATTR_POS; }
  void r_o0()  { attr2 &= ~GATTR_R_O; }
  void nok0()  { attr2 &= ~GATTR_NOK; }
  void fax0()  { attr2 &= ~GATTR_FAX; }

  void prn0()  { attr2 &= ~GATTR_PRN; }

  //  ----------------------------------------------------------------

  void pvt1()  { attr1 |= GATTR_PVT; }
  void cra1()  { attr1 |= GATTR_CRA; }
  void rcv1()  { attr1 |= GATTR_RCV; }
  void snt1()  { attr1 |= GATTR_SNT; }

  void att1()  { attr1 |= GATTR_ATT; }
  void trs1()  { attr1 |= GATTR_TRS; }
  void orp1()  { attr1 |= GATTR_ORP; }
  void k_s1()  { attr1 |= GATTR_K_S; }

  void loc1()  { attr1 |= GATTR_LOC; }
  void hld1()  { attr1 |= GATTR_HLD; }
  void rsv1()  { attr1 |= GATTR_RSV; }
  void frq1()  { attr1 |= GATTR_FRQ; }

  void rrq1()  { attr1 |= GATTR_RRQ; }
  void rrc1()  { attr1 |= GATTR_RRC; }
  void arq1()  { attr1 |= GATTR_ARQ; }
  void urq1()  { attr1 |= GATTR_URQ; }

  void grp1_()  { attr1 |= GATTR_GRP; }
  void imm1()  { attr1 |= GATTR_IMM; }
  void dir1()  { attr1 |= GATTR_DIR; }
  void tfs1()  { attr1 |= GATTR_TFS; }

  void kfs1()  { attr1 |= GATTR_KFS; }
  void lok1()  { attr1 |= GATTR_LOK; }
  void a_s1()  { attr1 |= GATTR_A_S; }
  void zon1()  { attr1 |= GATTR_ZON; }

  void hub1()  { attr1 |= GATTR_HUB; }
  void xma1()  { attr1 |= GATTR_XMA; }
  void cfm1()  { attr1 |= GATTR_CFM; }
  void hir1()  { attr1 |= GATTR_HIR; }

  void cov1()  { attr1 |= GATTR_COV; }
  void sig1()  { attr1 |= GATTR_SIG; }
  void let1()  { attr1 |= GATTR_LET; }
  void uns1()  { attr1 |= GATTR_UNS; }

  void del1()  { attr2 |= GATTR_DEL; }
  void nwm1()  { attr2 |= GATTR_NWM; }
  void rot1()  { attr2 |= GATTR_ROT; }
  void hex1()  { attr2 |= GATTR_HEX; }

  void upd1()  { attr2 |= GATTR_UPD; }
  void tou1()  { attr2 |= GATTR_TOU; }
  void fmu1()  { attr2 |= GATTR_FMU; }
  void scn1()  { attr2 |= GATTR_SCN; }

  void pos1()  { attr2 |= GATTR_POS; }
  void r_o1()  { attr2 |= GATTR_R_O; }
  void nok1()  { attr2 |= GATTR_NOK; }
  void fax1()  { attr2 |= GATTR_FAX; }

  void prn1()  { attr2 |= GATTR_PRN; }

  void pkd1()  { attr2 |= GATTR_PKD; }

  //  ----------------------------------------------------------------

  void pvtX()  { attr1 ^= GATTR_PVT; }
  void craX()  { attr1 ^= GATTR_CRA; }
  void rcvX()  { attr1 ^= GATTR_RCV; }
  void sntX()  { attr1 ^= GATTR_SNT; }

  void attX()  { attr1 ^= GATTR_ATT; }
  void trsX()  { attr1 ^= GATTR_TRS; }
  void orpX()  { attr1 ^= GATTR_ORP; }
  void k_sX()  { attr1 ^= GATTR_K_S; }

  void locX()  { attr1 ^= GATTR_LOC; }
  void hldX()  { attr1 ^= GATTR_HLD; }
  void rsvX()  { attr1 ^= GATTR_RSV; }
  void frqX()  { attr1 ^= GATTR_FRQ; }

  void rrqX()  { attr1 ^= GATTR_RRQ; }
  void rrcX()  { attr1 ^= GATTR_RRC; }
  void arqX()  { attr1 ^= GATTR_ARQ; }
  void urqX()  { attr1 ^= GATTR_URQ; }

  void grpX()  { attr1 ^= GATTR_GRP; }
  void immX()  { attr1 ^= GATTR_IMM; }
  void dirX()  { attr1 ^= GATTR_DIR; }
  void tfsX()  { attr1 ^= GATTR_TFS; }

  void kfsX()  { attr1 ^= GATTR_KFS; }
  void lokX()  { attr1 ^= GATTR_LOK; }
  void a_sX()  { attr1 ^= GATTR_A_S; }
  void zonX()  { attr1 ^= GATTR_ZON; }

  void hubX()  { attr1 ^= GATTR_HUB; }
  void xmaX()  { attr1 ^= GATTR_XMA; }
  void cfmX()  { attr1 ^= GATTR_CFM; }
  void hirX()  { attr1 ^= GATTR_HIR; }

  void covX()  { attr1 ^= GATTR_COV; }
  void sigX()  { attr1 ^= GATTR_SIG; }
  void letX()  { attr1 ^= GATTR_LET; }
  void unsX()  { attr1 ^= GATTR_UNS; }

  void delX()  { attr2 ^= GATTR_DEL; }
  void nwmX()  { attr2 ^= GATTR_NWM; }
  void rotX()  { attr2 ^= GATTR_ROT; }
  void hexX()  { attr2 ^= GATTR_HEX; }

  void updX()  { attr2 ^= GATTR_UPD; }
  void touX()  { attr2 ^= GATTR_TOU; }
  void fmuX()  { attr2 ^= GATTR_FMU; }
  void scnX()  { attr2 ^= GATTR_SCN; }

  void posX()  { attr2 ^= GATTR_POS; }
  void r_oX()  { attr2 ^= GATTR_R_O; }
  void nokX()  { attr2 ^= GATTR_NOK; }
  void faxX()  { attr2 ^= GATTR_FAX; }

  void prnX()  { attr2 ^= GATTR_PRN; }

};


//  ------------------------------------------------------------------

typedef ftn_attr Attr;


//  ------------------------------------------------------------------

inline void AttrAdd(Attr* a, Attr* b) { a->add(*b); }
inline void GetAttribstr(Attr* attr, const char* attrs) { attr->get(attrs); }
inline char* MakeAttrStr(char* str, size_t maxlen, const Attr* attr) { std::string tmp; attr->make_string(tmp); strxcpy(str, tmp.c_str(), maxlen); return str; }


//  ------------------------------------------------------------------

#endif

//  ------------------------------------------------------------------
