head 1.2; access; symbols last-version-before-change-to-ossp-style:1.1.1.1 VAR_0_0_0:1.1.1.1 VENDOR:1.1.1; locks; strict; comment @ * @; 1.2 date 2001.11.13.12.08.30; author simons; state dead; branches; next 1.1; 1.1 date 2001.11.09.17.01.37; author rse; state Exp; branches 1.1.1.1; next ; 1.1.1.1 date 2001.11.09.17.01.37; author rse; state Exp; branches; next ; desc @@ 1.2 log @- Moved all routines into a single source file var.c. - Renamed varexp.h to var.h. - Removed odin-based build system. - Moved test cases into var_test.c. - Adapted build system. @ text @#include "internal.h" int text(const char* begin, const char* end, char varinit, char escape) { const char* p; for (p = begin; p != end && *p != varinit; ++p) { if (*p == escape) { if (p+1 == end) return VAR_INCOMPLETE_QUOTED_PAIR; else ++p; } } return p - begin; } int varname(const char* begin, const char* end, const char nameclass[256]) { const char* p; for (p = begin; p != end && nameclass[(int)*p]; ++p) ; return p - begin; } int number(const char* begin, const char* end) { const char* p; for (p = begin; p != end && isdigit(*p); ++p) ; return p - begin; } int substext(const char* begin, const char* end, const var_config_t* config) { const char* p; for (p = begin; p != end && *p != config->varinit && *p != '/'; ++p) { if (*p == config->escape) { if (p+1 == end) return VAR_INCOMPLETE_QUOTED_PAIR; else ++p; } } return p - begin; } int exptext(const char* begin, const char* end, const var_config_t* config) { const char* p; for (p = begin; p != end && *p != config->varinit && *p != config->enddelim && *p != ':'; ++p) { if (*p == config->escape) { if (p+1 == end) return VAR_INCOMPLETE_QUOTED_PAIR; else ++p; } } return p - begin; } int exptext_or_variable(const char* begin, const char* end, const var_config_t* config, const char nameclass[256], var_cb_t lookup, void* lookup_context, int force_expand, tokenbuf* result) { const char* p = begin; tokenbuf tmp; int rc; init_tokenbuf(result); init_tokenbuf(&tmp); if (begin == end) return 0; do { rc = exptext(p, end, config); if (rc < 0) goto error_return; else if (rc > 0) { if (!append_to_tokenbuf(result, p, rc)) { rc = VAR_OUT_OF_MEMORY; goto error_return; } else p += rc; } rc = variable(p, end, config, nameclass, lookup, lookup_context, force_expand, &tmp); if (rc < 0) goto error_return; else if (rc > 0) { p += rc; if (!append_to_tokenbuf(result, tmp.begin, tmp.end - tmp.begin)) { rc = VAR_OUT_OF_MEMORY; goto error_return; } } } while (rc > 0); free_tokenbuf(&tmp); return p - begin; error_return: free_tokenbuf(&tmp); free_tokenbuf(result); return rc; } int substext_or_variable(const char* begin, const char* end, const var_config_t* config, const char nameclass[256], var_cb_t lookup, void* lookup_context, int force_expand, tokenbuf* result) { const char* p = begin; tokenbuf tmp; int rc; init_tokenbuf(result); init_tokenbuf(&tmp); if (begin == end) return 0; do { rc = substext(p, end, config); if (rc < 0) goto error_return; else if (rc > 0) { if (!append_to_tokenbuf(result, p, rc)) { rc = VAR_OUT_OF_MEMORY; goto error_return; } else p += rc; } rc = variable(p, end, config, nameclass, lookup, lookup_context, force_expand, &tmp); if (rc < 0) goto error_return; else if (rc > 0) { p += rc; if (!append_to_tokenbuf(result, tmp.begin, tmp.end - tmp.begin)) { rc = VAR_OUT_OF_MEMORY; goto error_return; } } } while (rc > 0); free_tokenbuf(&tmp); return p - begin; error_return: free_tokenbuf(&tmp); free_tokenbuf(result); return rc; } @ 1.1 log @Initial revision @ text @@ 1.1.1.1 log @import first cut of OSSP var @ text @@