Mercurial > hg > CbC > CbC_gcc
diff gcc/d/dmd/identifier.c @ 145:1830386684a0
gcc-9.2.0
author | anatofuz |
---|---|
date | Thu, 13 Feb 2020 11:34:05 +0900 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gcc/d/dmd/identifier.c Thu Feb 13 11:34:05 2020 +0900 @@ -0,0 +1,188 @@ + +/* Compiler implementation of the D programming language + * Copyright (C) 1999-2019 by The D Language Foundation, All Rights Reserved + * written by Walter Bright + * http://www.digitalmars.com + * Distributed under the Boost Software License, Version 1.0. + * http://www.boost.org/LICENSE_1_0.txt + * https://github.com/D-Programming-Language/dmd/blob/master/src/identifier.c + */ + +#include "root/dsystem.h" +#include "root/root.h" + +#include "identifier.h" +#include "mars.h" +#include "id.h" +#include "tokens.h" +#include "utf.h" + +Identifier::Identifier(const char *string, size_t length, int value) +{ + //printf("Identifier('%s', %d)\n", string, value); + this->string = string; + this->value = value; + this->len = length; +} + +Identifier::Identifier(const char *string) +{ + //printf("Identifier('%s')\n", string); + this->string = string; + this->value = TOKidentifier; + this->len = strlen(string); +} + +Identifier *Identifier::create(const char *string) +{ + return new Identifier(string); +} + +bool Identifier::equals(RootObject *o) +{ + return this == o || strncmp(string,o->toChars(),len+1) == 0; +} + +int Identifier::compare(RootObject *o) +{ + return strncmp(string, o->toChars(), len + 1); +} + +const char *Identifier::toChars() +{ + return string; +} + +int Identifier::getValue() const +{ + return value; +} + +const char *Identifier::toHChars2() +{ + const char *p = NULL; + + if (this == Id::ctor) p = "this"; + else if (this == Id::dtor) p = "~this"; + else if (this == Id::unitTest) p = "unittest"; + else if (this == Id::dollar) p = "$"; + else if (this == Id::withSym) p = "with"; + else if (this == Id::result) p = "result"; + else if (this == Id::returnLabel) p = "return"; + else + { p = toChars(); + if (*p == '_') + { + if (strncmp(p, "_staticCtor", 11) == 0) + p = "static this"; + else if (strncmp(p, "_staticDtor", 11) == 0) + p = "static ~this"; + else if (strncmp(p, "__invariant", 11) == 0) + p = "invariant"; + } + } + + return p; +} + +void Identifier::print() +{ + fprintf(stderr, "%s",string); +} + +int Identifier::dyncast() const +{ + return DYNCAST_IDENTIFIER; +} + +StringTable Identifier::stringtable; + +Identifier *Identifier::generateId(const char *prefix) +{ + static size_t i; + + return generateId(prefix, ++i); +} + +Identifier *Identifier::generateId(const char *prefix, size_t i) +{ OutBuffer buf; + + buf.writestring(prefix); + buf.printf("%llu", (ulonglong)i); + + char *id = buf.peekString(); + return idPool(id); +} + +/******************************************** + * Create an identifier in the string table. + */ + +Identifier *Identifier::idPool(const char *s, size_t len) +{ + StringValue *sv = stringtable.update(s, len); + Identifier *id = (Identifier *) sv->ptrvalue; + if (!id) + { + id = new Identifier(sv->toDchars(), len, TOKidentifier); + sv->ptrvalue = (char *)id; + } + return id; +} + +Identifier *Identifier::idPool(const char *s, size_t len, int value) +{ + StringValue *sv = stringtable.insert(s, len, NULL); + assert(sv); + Identifier *id = new Identifier(sv->toDchars(), len, value); + sv->ptrvalue = (char *)id; + return id; +} + +/********************************** + * Determine if string is a valid Identifier. + * Returns: + * 0 invalid + */ + +bool Identifier::isValidIdentifier(const char *p) +{ + size_t len; + size_t idx; + + if (!p || !*p) + goto Linvalid; + + if (*p >= '0' && *p <= '9') // beware of isdigit() on signed chars + goto Linvalid; + + len = strlen(p); + idx = 0; + while (p[idx]) + { + dchar_t dc; + const char *q = utf_decodeChar((const utf8_t *)p, len, &idx, &dc); + if (q) + goto Linvalid; + + if (!((dc >= 0x80 && isUniAlpha(dc)) || isalnum(dc) || dc == '_')) + goto Linvalid; + } + return true; + +Linvalid: + return false; +} + +Identifier *Identifier::lookup(const char *s, size_t len) +{ + StringValue *sv = stringtable.lookup(s, len); + if (!sv) + return NULL; + return (Identifier *)sv->ptrvalue; +} + +void Identifier::initTable() +{ + stringtable._init(28000); +}