/*--------------------------------------------------------------------*/ /* ft.h */ /* Author: Christopher Moretti and Vikash Modi '23 */ /*--------------------------------------------------------------------*/ #ifndef FT_INCLUDED #define FT_INCLUDED /* A File Tree is a representation of a hierarchy of directories and files: the File Tree is rooted at a directory, directories may be internal nodes or leaves, and files are always leaves. */ #include #include "a4def.h" /* Inserts a new directory into the FT with absolute path pcPath. Returns SUCCESS if the new directory is inserted successfully. Otherwise, returns: * INITIALIZATION_ERROR if the FT is not in an initialized state * BAD_PATH if pcPath does not represent a well-formatted path * CONFLICTING_PATH if the root exists but is not a prefix of pcPath * NOT_A_DIRECTORY if a proper prefix of pcPath exists as a file * ALREADY_IN_TREE if pcPath is already in the FT (as dir or file) * MEMORY_ERROR if memory could not be allocated to complete request */ int FT_insertDir(const char *pcPath); /* Returns TRUE if the FT contains a directory with absolute path pcPath and FALSE if not or if there is an error while checking. */ boolean FT_containsDir(const char *pcPath); /* Removes the FT hierarchy (subtree) at the directory with absolute path pcPath. Returns SUCCESS if found and removed. Otherwise, returns: * INITIALIZATION_ERROR if the FT is not in an initialized state * BAD_PATH if pcPath does not represent a well-formatted path * CONFLICTING_PATH if the root exists but is not a prefix of pcPath * NO_SUCH_PATH if absolute path pcPath does not exist in the FT * NOT_A_DIRECTORY if pcPath is in the FT as a file not a directory * MEMORY_ERROR if memory could not be allocated to complete request */ int FT_rmDir(const char *pcPath); /* Inserts a new file into the FT with absolute path pcPath, with file contents pvContents of size ulLength bytes. Returns SUCCESS if the new file is inserted successfully. Otherwise, returns: * INITIALIZATION_ERROR if the FT is not in an initialized state * BAD_PATH if pcPath does not represent a well-formatted path * CONFLICTING_PATH if the root exists but is not a prefix of pcPath, or if the new file would be the FT root * NOT_A_DIRECTORY if a proper prefix of pcPath exists as a file * ALREADY_IN_TREE if pcPath is already in the FT (as dir or file) * MEMORY_ERROR if memory could not be allocated to complete request */ int FT_insertFile(const char *pcPath, void *pvContents, size_t ulLength); /* Returns TRUE if the FT contains a file with absolute path pcPath and FALSE if not or if there is an error while checking. */ boolean FT_containsFile(const char *pcPath); /* Removes the FT file with absolute path pcPath. Returns SUCCESS if found and removed. Otherwise, returns: * INITIALIZATION_ERROR if the FT is not in an initialized state * BAD_PATH if pcPath does not represent a well-formatted path * CONFLICTING_PATH if the root exists but is not a prefix of pcPath * NO_SUCH_PATH if absolute path pcPath does not exist in the FT * NOT_A_FILE if pcPath is in the FT as a directory not a file * MEMORY_ERROR if memory could not be allocated to complete request */ int FT_rmFile(const char *pcPath); /* Returns the contents of the file with absolute path pcPath. Returns NULL if unable to complete the request for any reason. Note: checking for a non-NULL return is not an appropriate contains check, because the contents of a file may be NULL. */ void *FT_getFileContents(const char *pcPath); /* Replaces current contents of the file with absolute path pcPath with the parameter pvNewContents of size ulNewLength bytes. Returns the old contents if successful. (Note: contents may be NULL.) Returns NULL if unable to complete the request for any reason. */ void *FT_replaceFileContents(const char *pcPath, void *pvNewContents, size_t ulNewLength); /* Returns SUCCESS if pcPath exists in the hierarchy, Otherwise, returns: * INITIALIZATION_ERROR if the FT is not in an initialized state * BAD_PATH if pcPath does not represent a well-formatted path * CONFLICTING_PATH if the root's path is not a prefix of pcPath * NO_SUCH_PATH if absolute path pcPath does not exist in the FT * MEMORY_ERROR if memory could not be allocated to complete request When returning SUCCESS, if path is a directory: sets *pbIsFile to FALSE, *pulSize unchanged if path is a file: sets *pbIsFile to TRUE, and sets *pulSize to the length of file's contents When returning another status, *pbIsFile and *pulSize are unchanged. */ int FT_stat(const char *pcPath, boolean *pbIsFile, size_t *pulSize); /* Sets the FT data structure to an initialized state. The data structure is initially empty. Returns INITIALIZATION_ERROR if already initialized, and SUCCESS otherwise. */ int FT_init(void); /* Removes all contents of the data structure and returns it to an uninitialized state. Returns INITIALIZATION_ERROR if not already initialized, and SUCCESS otherwise. */ int FT_destroy(void); /* Returns a string representation of the data structure, or NULL if the structure is not initialized or there is an allocation error. The representation is depth-first with files before directories at any given level, and nodes of the same type ordered lexicographically. Allocates memory for the returned string, which is then owned by client! */ char *FT_toString(void); #endif