#ifndef FIDOADDR_H
#define FIDOADDR_H

#include        <string.h>
#include 	"ustr.hpp"
#include        "log.hpp"
#include	"ufmtypes.h"

#define FA_NOTMASK  0x80000000U
#define FA_ANYMASK  0x40000000U
#define FA_LSTMASK  0x20000000U
#define FA_NOTDEF   0x10000000U
#define FA_FROMMASK 0x08000000U
#define FA_TOMASK   0x04000000U
#define FA_OURMASK  0x02000000U
#define FA_SUBMASK  0x01000000U
#define FA_HOLDMASK 0x00100000U
#define FA_HUBMASK  0x00200000U
#define FA_PVTMASK  0x00400000U
#define FA_DOWNMASK 0x00800000U

#define FA_BADACT   0xb1f00000U
#define FA_BADROUTE 0xfbf00000U
#define FA_BADMASK  0x1c000000U
#define FA_BADPKT   0xbff00000U

#define FA_MASK     0xeff00000U
#define FA_ALLMASK  0xfff00000U

#define TOMASK_CHAR    "%"
#define FROMMASK_CHAR  "$"
#define LSTMASK_CHAR   "#"
#define NHOLDMASK_CHAR "H"
#define NDOWNMASK_CHAR "D"
#define NHUBMASK_CHAR  "U"
#define NPVTMASK_CHAR  "P"
#define ANYMASK_CHAR   "*"
#define NOTMASK_CHAR   "!"
#define OURMASK_CHAR   "@"
#define SUBMASK_CHAR   "&"

class FA {
private:
        dword zone_v;
        dword net_v;
        dword node_v;
        dword point_v;
public:
    int Parse(char *&p);
    inline dword    Zone()      const   { return zone_v; }
    inline dword    Net()       const   { return net_v; }
    inline dword    Node()      const   { return node_v; }
    inline dword    Point()     const   { return point_v; }
    inline void    Clean(void) { zone_v = net_v = node_v = point_v = FA_NOTDEF; };
    inline int     Masked(void) { return ((zone_v & FA_MASK) || (net_v & FA_MASK) ||
                                          (node_v & FA_MASK) || (point_v & FA_MASK)); };
    inline int     MaskValid(void) { return (!((zone_v & FA_BADMASK) || (net_v & FA_BADMASK) ||
                                            (node_v & FA_BADMASK) || 
                                            (!(point_v & FA_NOTDEF)&& (point_v & FA_BADMASK)))); };
    inline int     ActValid(void) { return (!((zone_v & FA_BADACT) || (net_v & FA_BADACT) ||
                                          (node_v & FA_BADACT) || (point_v & FA_BADACT))); };
    inline int     RouValid(void) { return (!((zone_v & FA_BADROUTE) || (net_v & FA_BADROUTE) ||
                                          (node_v & FA_BADROUTE) || (point_v & FA_BADROUTE))); };
    inline int     PKTValid(void) { return (!((zone_v & FA_BADPKT) || (net_v & FA_BADPKT) ||
                                          (node_v & FA_BADPKT) || (point_v & FA_BADPKT))); };
    inline int     AnyMask(void)  { return ((zone_v & FA_ALLMASK) || (net_v & FA_ALLMASK) ||
                                          (node_v & FA_ALLMASK) || (point_v & FA_ALLMASK)); };
    void    Zone(dword i)    { zone_v = i;}
    void    Net(dword i)     { net_v = i; }
    void    Node(dword i)    { node_v = i; }
    void    Point(dword i)   { point_v = i; }
    operator Str() const;
    FA(void);
    FA(const FA &);

    int operator == ( const FA &a) const;
    int operator != ( const FA &a ) const;
    FA & operator =  ( const FA &a );
    int Valid( void ) const;

};

Str fatoa(unsigned int i);

/*--------------------------------------------------------------------------*/

// LogStream &operator <<(LogStream &os,FA &f);
// LogStream &operator <<(LogStream &os,FA const &f);

// void Parse_NetNode(char *netnode,word *zone,word *net,word *node,word *point);

#endif // FIDOADDR_H


syntax highlighted by Code2HTML, v. 0.9.1