#define SDCCUTIL_H
#include "SDCChasht.h"
-
-/* PENDING: Hacks as I can't work autoconf */
-#define BINDIR PREFIX "/bin"
+#include "dbuf.h"
+#include <stdarg.h>
/** Given an array of name, value string pairs creates a new hash
containing all of the pairs.
*/
-hTab *populateStringHash(const char **pin);
+hTab *populateStringHash (const char **pin);
-/** Given an array of string pointers and another string, adds the
- string to the end of the list. The end of the list is assumed to
- be the first NULL pointer.
+/** Prints elements of the set to the file, each element on new line
*/
-void addToList (const char **list, const char *str);
+void fputStrSet (FILE *fp, set *list);
-/** Given an array of string pointers returns a string containing all
- of the strings seperated by spaces. The returned string is on the
- heap. The join stops when a NULL pointer is hit.
+/** Prepend / append given strings to each item of string set. The result is in a
+ new string set.
*/
-char *join(const char **pplist);
+set *appendStrSet (set *list, const char *pre, const char *post);
-/** Given an array of string pointers, returns a string containing all
- of the strings seperated by spaces. The returned string is on the
- heap. n is the number of strings in the list.
+/** Given a set returns a string containing all of the strings seperated
+ by spaces. The returned string is on the heap.
*/
-char *joinn(char **pplist, int n);
+const char *joinStrSet (set *list);
-/** Returns the characters in the path p2 past the last matching characters in
- p1. Processes in a host dependent way. For example, on win32 the
- test is case insensitive and treats '/' and '\' as the same.
-*/
-char *getPathDifference (char *pinto, const char *p1, const char *p2);
+/** Split the path string to the directory and file name (including extension) components.
+ The directory component doesn't contain trailing directory separator.
+ Returns true if the path contains the directory separator. */
+int dbuf_splitPath (const char *path, struct dbuf_s *dir, struct dbuf_s *file);
+
+/** Split the path string to the file name (including directory) and file extension components.
+ The file name component doesn't contain trailing extension separator.
+ Returns true if the path contains the extension separator. */
+int dbuf_splitFile (const char *path, struct dbuf_s *file, struct dbuf_s *ext);
+
+/** Combile directory and the file name to a path string using the DIR_SEPARATOR_CHAR.
+ */
+void dbuf_makePath (struct dbuf_s *path, const char *dir, const char *file);
/** Given a file with path information in the binary files directory,
- returns what PREFIX must be to get this path. Used for discovery
- of where SDCC is installed. Returns NULL if the path is
+ returns the directory component. Used for discovery of bin
+ directory of SDCC installation. Returns NULL if the path is
impossible.
*/
-char *getPrefixFromBinPath (const char *prel);
+const char *getBinPath (const char *prel);
/** Returns true if the given path exists.
*/
void populateMainValues (const char **ppin);
-void buildCmdLine2 (char *pbuffer, const char *pcmd);
+void buildCmdLine2 (char *pbuffer, size_t len, const char *pcmd, ...);
/** Returns true if sz starts with the string given in key.
*/
*/
void chomp (char *sz);
-#endif
+hTab *getRuntimeVariables (void);
+
+/* strncpy() with guaranteed NULL termination. */
+char *strncpyz (char *dest, const char *src, size_t n);
+
+/* like strncat() with guaranteed NULL termination
+ * The passed size should be the size of the dest buffer, not the number of
+ * bytes to copy.
+ */
+char *strncatz (char *dest, const char *src, size_t n);
+
+/* return SDCC build number */
+const char *getBuildNumber (void);
+
+/* return SDCC build date */
+const char *getBuildDate (void);
+
+/* return environment used to build SDCC */
+const char *getBuildEnvironment(void);
+
+/* snprintf, by hook or by crook. */
+size_t SDCCsnprintf (char *, size_t, const char *, ...);
+# if defined(HAVE_VSNPRINTF)
+
+// best option: we can define our own snprintf which logs errors.
+# define SNPRINTF SDCCsnprintf
+
+# elif defined(HAVE_SPRINTF)
+
+// if we can't build a safe snprintf for lack of vsnprintf but there
+// is a native snprintf, use it.
+# define SNPRINTF snprintf
+
+# elif defined(HAVE_VSPRINTF)
+
+// we can at least define our own unsafe version.
+# define SNPRINTF SDCCsnprintf
+
+# else
+// We don't have a native snprintf nor the functions we need to write one.
+# error "Need at least one of snprintf, vsnprintf, vsprintf!"
+# endif
+
+/** Pragma tokenizer
+ */
+enum pragma_token_e { TOKEN_UNKNOWN, TOKEN_STR, TOKEN_INT, TOKEN_EOL };
+
+struct pragma_token_s {
+ enum pragma_token_e type;
+ struct dbuf_s dbuf;
+ union {
+ int int_val;
+ } val;
+};
+
+void init_pragma_token (struct pragma_token_s *token);
+char *get_pragma_token (const char *s, struct pragma_token_s *token);
+const char *get_pragma_string (struct pragma_token_s *token);
+void free_pragma_token (struct pragma_token_s *token);
+
+unsigned char hexEscape (const char **src);
+unsigned char octalEscape (const char **src);
+int copyStr (char *dest, const char *src);
+
+#endif