home *** CD-ROM | disk | FTP | other *** search
/ vsiftp.vmssoftware.com / VSIPUBLIC@vsiftp.vmssoftware.com.tar / FREEWARE / FREEWARE40.ZIP / flistfrontend / src / dirent.h < prev    next >
Encoding:
C/C++ Source or Header  |  1995-11-15  |  8.9 KB  |  266 lines

  1. /* $Id: dirent.h,v 1.16 1995/11/15 20:21:50 tom Exp $ */
  2.  
  3. /*
  4.  * Title:    dirent.h
  5.  * Author:    Thomas E. Dickey
  6.  * Created:    02 May 1984
  7.  * Last update:
  8.  *        28 May 1995, prototypes
  9.  *        18 Feb 1995, ported to DEC Alpha.
  10.  *        04 Nov 1988, added field ".fexpr", enlarged .f_mbm, .f_grp
  11.  *        09 Sep 1985, added NAME_DOT
  12.  *        30 Jul 1985, removed 'numreads'
  13.  *        16 Jul 1985, changed 'filelist' to an array of pointers to
  14.  *                 'filelink'.
  15.  *        13 Jul 1985, added FLINK, filelink.
  16.  *        05 Jul 1985, use FK, FK_ to absorb other references to filelist.
  17.  *                 Added '.path_refs' member to PATHENT.
  18.  *        02 Jul 1985, make 'filelist', etc., into import-definitions
  19.  *        27 Jun 1985, corrected value of 'WILD_VER'
  20.  *        16 Jun 1985, file-version (and WILD_CARD) are *signed*.
  21.  *        15 Jun 1985, added 'FK' to absorb references to 'filelist'.
  22.  *        13 Jun 1985, added 'dateflag', 'datechek'
  23.  *        18 May 1985, added 'pcolumns'
  24.  *        22 Mar 1985, added '.fidnum', '.f_recl' to FILENT
  25.  *        10 Mar 1985, moved buffers out of PATHNT
  26.  *        01 Feb 1985, added 'WILD_VER', change 'readlist' (cf: dirread)
  27.  *        24 Dec 1984, added 'D_mode'
  28.  *        22 Dec 1984, added '.fallc' (allocation)
  29.  *        20 Dec 1984, added width-latch for FORMAT.
  30.  *        11 Dec 1984, added 'NOPRIV' definition.
  31.  *        05 Dec 1984, make filename, filetype pointers (not fixed size)
  32.  *                 increase name,type lengths for VMS 4.0
  33.  *        16 Nov 1984, added record-format stuff
  34.  *        02 Sep 1984, convert to support "import"
  35.  *        25 Aug 1984, use "names.h"
  36.  *        14 Aug 1984, moved DELETED def here, added '.fmisc' to FILENT
  37.  *        06 Aug 1984, added '.fhour' component to FILENT
  38.  *        28 Jul 1984, added FILENT_????_size, re-ordered FILENT
  39.  *        26 Jul 1984, added 'LOCKED', 'readlist'
  40.  *        20 Jul 1984, added 'numreads'
  41.  *        15 Jul 1984, added 'O_opt', also tag component to PATHNT
  42.  *        03 Jul 1984, re-ordered FILENT to match GETPROT
  43.  *        21 May 1984
  44.  *
  45.  *    Define structure used by FLIST to store information for a directory
  46.  *    entry.
  47.  */
  48.  
  49. #ifndef DIRENT_H
  50. #define DIRENT_H
  51.  
  52. #include    <rms.h>
  53.  
  54. #include    "names.h"
  55.  
  56. #define    MAX_NAME    39    /* length of filename        */
  57. #define    MAX_TYPE    39    /* length of filetype        */
  58. #define    WILD_VER    (-32768)
  59. #define    NAME_DOT    1    /* adjustment to get trailing '.' on name */
  60.  
  61. /*
  62.  * Base of FILENT data, given index to 'filelist':
  63.  */
  64. #define    FK(k)    filelist[k]->fk
  65. #define    FK_(k)    (&FK(k))    /* address of the FILENT-block */
  66.  
  67. /*
  68.  * FLIST makes a linked-list of these, to be able to test the pathname
  69.  * independently of the filename, and to save space:
  70.  */
  71. typedef    struct my_pathnt {
  72.     struct my_pathnt *path_next;    /* => next entry in chain    */
  73.     unsigned
  74.     char    path_refs;    /* level-reference flag (TEXTLINK) */
  75.     short    path_sort;    /* sort key, used in 'dirsrt.c'    */
  76.     char    *path_text,    /* => pathname, include device    */
  77.         *path_trim;    /* => string used in sorting    */
  78.     } PATHNT;
  79.  
  80. #define    zPATHOF(z)    (z->fpath_->path_text)
  81. #define    PATHOF(inx)    (FK(inx).fpath_->path_text)
  82.  
  83. #ifndef    RMS$_PRV
  84. #define    RMS$_PRV    0x1829a
  85. #endif
  86. #define    zNOPRIV(z)    (z->fstat == RMS$_PRV)
  87. #define    NOPRIV(inx)    (FK(inx).fstat == RMS$_PRV)
  88.  
  89. #ifndef    RMS$_FLK
  90. #define    RMS$_FLK    0x1828a
  91. #endif
  92. #define    zLOCKED(z)    (z->fstat == RMS$_FLK)
  93. #define    LOCKED(inx)    (FK(inx).fstat == RMS$_FLK)
  94.  
  95. #ifndef    RMS$_FNF
  96. #define    RMS$_FNF    0x18292
  97. #endif
  98. #define    zDELETED(z)    (z->fstat == RMS$_FNF)
  99. #define    DELETED(inx)    (FK(inx).fstat == RMS$_FNF)
  100.  
  101. #include "datent.h"
  102. #include "getprot.h"
  103.  
  104. /*
  105.  * FLIST stores one of these for each filename:
  106.  */
  107. typedef    struct my_filent {
  108.     /*
  109.      * Path,name,type and version are grouped for same-name lookups:
  110.      */
  111.     PATHNT    *fpath_;    /* => PATHNT entry            */
  112.     char    *fname,        /* filename, less path, type        */
  113.         *ftype;        /* filetype, less "."            */
  114.     short    fvers;        /* File version number (1-32767)    */
  115.     /*
  116.      * Other data are unordered:
  117.      */
  118.     DATENT    fdate;        /* Creation date (DIR/DATE)        */
  119.     DATENT    fback;        /* Backup date (DIR/FULL)        */
  120.     DATENT    frevi;        /* Revision date (DIR/FULL)        */
  121.     DATENT    fexpr;        /* Expiration date (DIR/FULL)        */
  122.     unsigned
  123.     short    fhour;        /* Hour-in-day for "/sh" sorts        */
  124.     unsigned fsize;        /* File size (DIR/SIZE), -1=unknown    */
  125.     unsigned fallc;        /* File allocation            */
  126.     unsigned fstat;        /* RMS-status on open            */
  127.     unsigned
  128.     char    fmisc,        /* temp bit-vector for list manipulation*/
  129.         f_rat,        /* FAB: record attributes        */
  130.         f_rfm,        /* FAB: record format            */
  131.         ftext;        /* set iff 'INSPECT' says file is text    */
  132.     unsigned
  133.     short    f_recl;        /* Record-length            */
  134.     unsigned
  135.     short    fidnum[3];    /* File-identifier            */
  136.     GETPROT    f_getprot;
  137.     char    *f_user;    /* user identifier (from f_getprot)    */
  138.     } FILENT;
  139.  
  140. #define    fprot    f_getprot.p_mask
  141. #define    f_grp    f_getprot.p_grp
  142. #define    f_mbm    f_getprot.p_mbm
  143.  
  144. /*
  145.  * Patch: There appears to be no automatic way to get 'sizeof(FILENT.fpath_)'
  146.  *    or 'sizeof(FILENT.fvers)', which are 4 and 2 respectively.
  147.  */
  148. #define    FILENT_vers_size     (4 + 4 + 4)
  149. #define    FILENT_name_size     (FILENT_vers_size + 2)
  150.  
  151. /*
  152.  * FLIST stores the FILENT blocks in a linked-list which is accessible to all
  153.  * levels of the hierarchy.  A given level uses an array of pointers (for fast
  154.  * access) to its own subset of the FILENT-blocks.  This list can be automatically
  155.  * constructed from the '.file_refs' mask (see NAMEHEAP).
  156.  */
  157. typedef    struct my_flink {
  158.     struct my_flink    *file_next; /* => next entry in chain    */
  159.     unsigned
  160.     char    file_refs;    /* level-reference flag (TEXTLINK) */
  161.     FILENT    fk;        /* file-data-block        */
  162.     }    FLINK;
  163.  
  164.  
  165. /*
  166.  * Define an 'import' structure, to permit me to do this in a structured
  167.  * manner.  (One problem with the bulk-include is that the link-map grows
  168.  * phenomenally).  This relies on the CC-preprocessor to perform string
  169.  * concatenation.
  170.  */
  171. #define    type_AnyXAB    int        /* TRUE if any of a,d,p options    */
  172. #define    type_A_opt    int        /* Show file allocation        */
  173. #define    type_D_opt    int        /* Show creation date        */
  174. #define    type_D_mode    int        /* Mode in which to show date    */
  175. #define    type_H_opt    int        /* Permit sort-by-hour        */
  176. #define    type_M_opt    int        /* Show protection mask        */
  177. #define    type_O_opt    int        /* Show owner code        */
  178. #define    type_P_opt    int        /* Show names of no-priv files    */
  179. #define    type_V_opt    int        /* Show only highest version    */
  180. #define    type_ccolumns    char        /* width(path,name,type,vers,rfm,user)*/
  181. #define    type_pcolumns    char        /* printing-widths (override)    */
  182. #define    type_conv_list    char        /* display-format codes (alpha)    */
  183. #define    type_maxfiles    int        /* # of files (space allocated)    */
  184. #define    type_numfiles    int        /* # of items in 'filelist[]'    */
  185. #define    type_numdlets    int        /* # of those which are deleted    */
  186. #define    type_pathlist    PATHNT    *    /* pathnames (common)        */
  187. #define    type_filelink    FLINK    *    /* filenames and their data    */
  188. #define    type_filelist    FLINK    **    /* filenames and their data    */
  189. #define    type_readlist    FILENT    *    /* => list of filespecs read in    */
  190. #define    type_readllen    int        /* # of entries in 'readlist[]'    */
  191. #define    type_namelist    char    *    /* => list of filenames, types    */
  192. #define    type_dateflag    int        /* (AFTER,BEFORE) (D_opt)    */
  193. #define    type_datechek    DATENT        /* date-selection threshold    */
  194.  
  195. #define    size_AnyXAB
  196. #define    size_A_opt
  197. #define    size_D_opt
  198. #define    size_D_mode
  199. #define    size_H_opt
  200. #define    size_M_opt
  201. #define    size_O_opt
  202. #define    size_P_opt
  203. #define    size_V_opt
  204. #define    size_ccolumns    [9]        /* name,type,version,path,rfm,org,user,size,alloc*/
  205. #define    size_pcolumns    [2]        /* name,type    */
  206. #define    size_conv_list    [27]
  207. #define    size_maxfiles
  208. #define    size_numfiles
  209. #define    size_numdlets
  210. #define    size_pathlist
  211. #define    size_filelink
  212. #define    size_filelist
  213. #define    size_readlist
  214. #define    size_readllen
  215. #define    size_namelist
  216. #define    size_dateflag    [2]        /* (AFTER,BEFORE) (D_opt)    */
  217. #define    size_datechek            /* date-selection threshold    */
  218.  
  219. #ifndef    DIRENT
  220. #define    DIRENT    extern
  221. #endif
  222.  
  223. #if __STDC__
  224. #define concat(a,b)  a ## b
  225. #define import(x)    DIRENT    concat(type_,x)    x concat(size_,x)
  226. #else
  227. #define import(x)    DIRENT    type_/**/x    x size_/**/x
  228. #endif
  229.  
  230. extern    int    dirent__datechek (FILENT *z);
  231. extern    int    dirent_acc (FILENT *z, char *mode);
  232. extern    int    dirent_add (void);
  233. extern    void    dirent_all (char *filespec, int update);
  234. extern    void    dirent_cat_n (char *s, FILENT *z);
  235. extern    int    dirent_ccol (void);
  236. extern    int    dirent_chk (FILENT *z, char *filespec);
  237. extern    int    dirent_chk2 (int j);
  238. extern    int    dirent_chk3 (int j, char *fullname);
  239. extern    int    dirent_chop (FILENT *z, char *filespec, struct NAM *nam_);
  240. extern    void    dirent_conv (char *bfr, FILENT *z);
  241. extern    char*    dirent_dft (void);
  242. extern    void    dirent_dlet (int j);
  243. extern    char*    dirent_glue (char *filespec, FILENT *z);
  244. extern    char*    dirent_glue2 (char *filespec, FILENT *z, int curfile);
  245. extern    int    dirent_isdir (FILENT *z);
  246. extern    unsigned dirent_look (char *longspec, char *filespec);
  247. extern    void    dirent_misc (int inx, int bitv);
  248. extern    void    dirent_nul (int inx);
  249. extern    int    dirent_old (char *filespec, int need);
  250. extern    int    dirent_old1 (FILENT *z, char *spec);
  251. extern    int    dirent_old_any (FILENT *z, char *filespec, int need);
  252. extern    int    dirent_width (FILENT *z);
  253.  
  254. #ifdef    DCLARG_H
  255. extern    int    dirent (DCLARG *arg_);
  256. #endif
  257.  
  258. extern    int    dirhigh (char *filespec);
  259. extern    int    diropen (char *name_);
  260. extern    int    diropen2 (FILENT *z);
  261.  
  262. extern    unsigned acplook (FILENT *z, char *filespec, struct NAM *nam_);
  263. extern    unsigned rmslook (FILENT *z, struct FAB *fab_);
  264.  
  265. #endif    /* DIRENT_H */
  266.