| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120 | /*  +----------------------------------------------------------------------+  | PHP Version 7                                                        |  +----------------------------------------------------------------------+  | Copyright (c) 1997-2013 The PHP Group                                |  +----------------------------------------------------------------------+  | http://www.opensource.org/licenses/mit-license.php  MIT License      |  +----------------------------------------------------------------------+  | Author: Jani Taskinen <[email protected]>                         |  | Author: Patrick Reilly <[email protected]>                             |  +----------------------------------------------------------------------+*/#ifdef HAVE_CONFIG_H#include "config.h"#endif#include "php_v8js_macros.h"extern "C" {#include "php.h"#include "zend_exceptions.h"}static void v8js_commonjs_split_terms(const char *identifier, std::vector<char *> &terms){    char *term = (char *) emalloc(PATH_MAX), *ptr = term;    while (*identifier > 0) {        if (*identifier == '/') {            if (ptr > term) {                // Terminate term string and add to terms vector                *ptr++ = 0;                terms.push_back(estrdup(term));                // Reset term string                ptr = term;            }        } else {            *ptr++ = *identifier;        }        identifier++;    }    if (ptr > term) {        // Terminate term string and add to terms vector        *ptr++ = 0;        terms.push_back(estrdup(term));    }    efree(term);}void v8js_commonjs_normalise_identifier(const char *base, const char *identifier, char *normalised_path, char *module_name){    std::vector<char *> id_terms, terms;    v8js_commonjs_split_terms(identifier, id_terms);    // If we have a relative module identifier then include the base terms    if (!strcmp(id_terms.front(), ".") || !strcmp(id_terms.front(), "..")) {        v8js_commonjs_split_terms(base, terms);    }    terms.insert(terms.end(), id_terms.begin(), id_terms.end());    std::vector<char *> normalised_terms;    for (std::vector<char *>::iterator it = terms.begin(); it != terms.end(); it++) {        char *term = *it;        if (!strcmp(term, "..")) {            // Ignore parent term (..) if it's the first normalised term            if (normalised_terms.size() > 0) {                // Remove the parent normalized term (and free it)                efree(normalised_terms.back());                normalised_terms.pop_back();            }            // free the ".." term            efree(term);        } else if (strcmp(term, ".")) {            // Add the term if it's not the current term (.)            normalised_terms.push_back(term);        } else {            // Discard "." term            efree(term);        }    }    // Initialise the normalised path string    *normalised_path = 0;    *module_name = 0;    strcat(module_name, normalised_terms.back());    efree(normalised_terms.back());    normalised_terms.pop_back();    for (std::vector<char *>::iterator it = normalised_terms.begin(); it != normalised_terms.end(); it++) {        char *term = *it;        if (strlen(normalised_path) > 0) {            strcat(normalised_path, "/");        }        strcat(normalised_path, term);        efree(term);    }}/* * Local variables: * tab-width: 4 * c-basic-offset: 4 * indent-tabs-mode: t * End: * vim600: noet sw=4 ts=4 fdm=marker * vim<600: noet sw=4 ts=4 */
 |