diff options
Diffstat (limited to 'lib/idfile.h')
-rw-r--r-- | lib/idfile.h | 158 |
1 files changed, 158 insertions, 0 deletions
diff --git a/lib/idfile.h b/lib/idfile.h new file mode 100644 index 0000000..c2cd0a0 --- /dev/null +++ b/lib/idfile.h @@ -0,0 +1,158 @@ +/* idfile.h -- decls for ID file header and constituent file names + Copyright (C) 1986, 1995 Greg McGary + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program 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 General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +#ifndef _idfile_h_ +#define _idfile_h_ 1 + +#include <sys/types.h> +#include <stdio.h> +#include <obstack.h> +#include "hash.h" + +/* The ID file header is the nexus of all ID file information. This + is an in-core structure, only some of which is read/written to disk. */ + +struct idhead +{ + unsigned char idh_magic[2]; +#define IDH_MAGIC_0 ('I'|0x80) +#define IDH_MAGIC_1 ('D'|0x80) + unsigned char idh_version; +#define IDH_VERSION 4 + unsigned short idh_flags; +#define IDH_COUNTS (1<<0) /* include occurrence counts for each token */ +#define IDH_FOLLOW_SL (1<<1) /* follow symlinks to directories */ +#define IDH_COMMENTS (1<<2) /* include tokens found in comments */ +#define IDH_LOCALS (1<<3) /* include names of formal params & local vars */ +#define IDH_DECL_DEFN_USE (1<<4) /* include decl/defn/use info */ +#define IDH_L_R_VALUE (1<<5) /* include lvalue/rvalue info */ +#define IDH_CALL_ER_EE (1<<6) /* include caller/callee relationship info */ + unsigned long idh_file_links; /* total # of file links */ + unsigned long idh_files; /* total # of constituent source files */ + unsigned long idh_tokens; /* total # of constituent tokens */ + /* idh_*_size: max buffer-sizes for ID file reading programs */ + unsigned long idh_buf_size; /* # of bytes in longest entry */ + unsigned long idh_vec_size; /* # of hits in longest entry */ + /* idh_*_offset: ID file offsets for start of various sections */ + long idh_tokens_offset; /* constituent tokens section */ + long idh_flinks_offset; /* constituent file & directory names section */ + long idh_end_offset; /* end of tokens section */ + unsigned short idh_max_link; /* longest file name component */ + unsigned short idh_max_path; /* largest # of file name components */ + + /* The following are run-time variables and are not stored on disk */ + struct hash_table idh_member_file_table; + struct hash_table idh_file_link_table; +#if HAVE_LINK + struct hash_table idh_dev_ino_table; /* for detecting file name aliases */ +#endif + struct obstack idh_member_file_obstack; + struct obstack idh_file_link_obstack; +#if HAVE_LINK + struct obstack idh_dev_ino_obstack; +#endif + char *idh_file_name; + FILE *idh_FILE; +#if 0 + time_t idh_mod_time; + struct arg_file **idh_file_order; /* sequence in ID file */ + struct arg_file **idh_scan_order; /* sequence in summaries */ +#endif +}; + +/* A file_link represents a single component (file or directory) in a + file name. It has a name, a parent file_link and some flags. */ + +struct file_link +{ + union { + struct file_link *u_parent; +#define fl_parent fl_u.u_parent + unsigned long u_index; +#define fl_index fl_u.u_index +#define FL_PARENT_INDEX_BYTES 3 +#define IS_ROOT_FILE_LINK(flink) ((flink)->fl_parent == (flink)) + } fl_u; + unsigned char fl_flags; +#define FL_CMD_LINE_ARG (1<<0) +#define FL_USED (1<<1) +#define FL_MEMBER (1<<2) /* has a corresponding member_file entry */ +#define FL_SCAN_ME (1<<3) +#define FL_SYM_LINK (1<<4) +#define FL_TYPE_MASK (FL_TYPE_DIR|FL_TYPE_FILE) +# define FL_TYPE_DIR (1<<5) +# define FL_IS_DIR(_f_) (((_f_) & FL_TYPE_MASK) == FL_TYPE_DIR) +# define FL_TYPE_FILE (1<<6) +# define FL_IS_FILE(_f_) (((_f_) & FL_TYPE_MASK) == FL_TYPE_FILE) + char fl_name[1]; +}; + +/* A member_file represents a source file that is treated by mkid. */ + +struct member_file +{ + struct file_link *mf_link; + struct lang_args const *mf_lang_args; +time_t mf_modify_time; +time_t mf_access_time; + short mf_index; /* order in ID file */ +}; + +#if HAVE_LINK + +/* On systems that support multiple names for a single file (via hard + and/or soft links), dev_ino records information needed to detect + such aliasing. */ + +struct dev_ino +{ + dev_t di_dev; + ino_t di_ino; + struct file_link *di_link; +}; + +extern struct hash_table dev_ino_table; + +#endif + +extern struct idhead idh; + +extern struct file_link **read_id_file __P((char const *id_file_name, struct idhead *idhp)); +extern struct file_link **maybe_read_id_file __P((char const *id_file_name, struct idhead *idhp)); +extern int read_idhead __P((struct idhead *idhp)); +extern int write_idhead __P((struct idhead *idhp)); +extern int sizeof_idhead __P((void)); +extern void init_idh_obstacks __P((struct idhead *idhp)); +extern void init_idh_tables __P((struct idhead *idhp)); + +#define IO_TYPE_INT 0 /* integer */ +#define IO_TYPE_STR 1 /* NUL terminated string */ +#define IO_TYPE_FIX 2 /* fix-sized */ + +extern int io_write __P((FILE *output_FILE, void *addr, unsigned int size, int io_type)); +extern int io_read __P((FILE *input_FILE, void *addr, unsigned int size, int io_type)); +extern struct file_link *get_current_dir_link __P((void)); + +extern struct file_link **deserialize_file_links __P((struct idhead *idhp)); +extern void mark_member_file_links __P((struct idhead *idhp)); +extern int member_file_qsort_compare __P((void const *x, void const *y)); +extern void serialize_file_links __P((struct idhead *idhp)); +extern struct file_link *parse_file_name __P((char *file_name, + struct file_link *relative_dir_link)); + +#endif /* not _idfile_h_ */ |