static void defineDotEdges(pANTLR3_BASE_TREE_ADAPTOR adaptor, void * t, pANTLR3_STRING dotSpec) { // How many nodes are we talking about? // int nCount; int i; if (t == NULL) { // No tree, so do nothing // return; } // Count the nodes // nCount = adaptor->getChildCount(adaptor, t); if (nCount == 0) { // This will already have been included as a child of another node // so there is nothing to add. // return; } // For each child, define an edge from this parent, then process // and children of this child in the same way // for (i=0; i<nCount; i++) { pANTLR3_BASE_TREE child; char buff[128]; // Next child // child = adaptor->getChild(adaptor, t, i); // Create the edge relation // sprintf(buff, "\t\tn%p -> n%p\t\t// ", t, child); dotSpec->append8(dotSpec, buff); // Document the relationship // dotSpec->appendS(dotSpec, adaptor->getText(adaptor, t)); dotSpec->append8(dotSpec, " -> "); dotSpec->appendS(dotSpec, adaptor->getText(adaptor, child)); dotSpec->append8(dotSpec, "\n"); // Define edges for this child // defineDotEdges(adaptor, child, dotSpec); } // Done // return; }
static void toStringWork (pANTLR3_TREE_NODE_STREAM tns, pANTLR3_BASE_TREE p, pANTLR3_BASE_TREE stop, pANTLR3_STRING buf) { ANTLR3_UINT32 n; ANTLR3_UINT32 c; if (!p->isNilNode(p) ) { pANTLR3_STRING text; text = p->toString(p); if (text == NULL) { text = tns->ctns->stringFactory->newRaw(tns->ctns->stringFactory); text->addc (text, ' '); text->addi (text, p->getType(p)); } buf->appendS(buf, text); } if (p == stop) { return; /* Finished */ } n = p->getChildCount(p); if (n > 0 && ! p->isNilNode(p) ) { buf->addc (buf, ' '); buf->addi (buf, ANTLR3_TOKEN_DOWN); } for (c = 0; c<n ; c++) { pANTLR3_BASE_TREE child; child = p->getChild(p, c); tns->toStringWork(tns, child, stop, buf); } if (n > 0 && ! p->isNilNode(p) ) { buf->addc (buf, ' '); buf->addi (buf, ANTLR3_TOKEN_UP); } }
static pANTLR3_UINT8 insert8 (pANTLR3_STRING string, ANTLR3_UINT32 point, const char * newbit) { ANTLR3_UINT32 len; if (point >= string->len) { return string->append(string, newbit); } len = (ANTLR3_UINT32)strlen(newbit); if (len == 0) { return string->chars; } if (string->size < (string->len + len + 1)) { string->chars = (pANTLR3_UINT8) ANTLR3_REALLOC((void *)string->chars, (ANTLR3_UINT32)(string->len + len + 1)); string->size = string->len + len + 1; } /* Move the characters we are inserting before, including the delimiter */ ANTLR3_MEMMOVE((void *)(string->chars + point + len), (void *)(string->chars + point), (ANTLR3_UINT32)(string->len - point + 1)); /* Note we copy the exact number of bytes */ ANTLR3_MEMMOVE((void *)(string->chars + point), newbit, (ANTLR3_UINT32)(len)); string->len += len; return string->chars; }
static pANTLR3_UINT8 insertiUTF16 (pANTLR3_STRING string, ANTLR3_UINT32 point, ANTLR3_INT32 i) { ANTLR3_UINT8 newbit[32]; sprintf((char *)newbit, "%d", i); return string->insert8(string, point, (const char *)newbit); }
static pANTLR3_UINT8 addiUTF16 (pANTLR3_STRING string, ANTLR3_INT32 i) { ANTLR3_UINT8 newbit[32]; sprintf((char *)newbit, "%d", i); return string->append8(string, (const char *)newbit); }
static pANTLR3_UINT8 appendS (pANTLR3_STRING string, pANTLR3_STRING newbit) { /* We may be passed an empty string, in which case we just return the current pointer */ if (newbit == NULL || newbit->len == 0 || newbit->size == 0 || newbit->chars == NULL) { return string->chars; } else { return string->append(string, (const char *)(newbit->chars)); } }
static pANTLR3_UINT8 insertUTF16_UTF16 (pANTLR3_STRING string, ANTLR3_UINT32 point, const char * newbit) { ANTLR3_UINT32 len; pANTLR3_UINT16 in; if (point >= string->len) { return string->append(string, newbit); } /** First, determine the length of the input string */ in = (pANTLR3_UINT16)newbit; len = 0; while (*in++ != '\0') { len++; } if (len == 0) { return string->chars; } if (string->size < (string->len + len + 1)) { string->chars = (pANTLR3_UINT8) ANTLR3_REALLOC((void *)string->chars, (ANTLR3_UINT32)(sizeof(ANTLR3_UINT16)*(string->len + len + 1))); string->size = string->len + len + 1; } /* Move the characters we are inserting before, including the delimiter */ ANTLR3_MEMMOVE((void *)(((pANTLR3_UINT16)string->chars) + point + len), (void *)(((pANTLR3_UINT16)string->chars) + point), (ANTLR3_UINT32)(sizeof(ANTLR3_UINT16)*(string->len - point + 1))); /* Note we copy the exact number of characters */ ANTLR3_MEMMOVE((void *)(((pANTLR3_UINT16)string->chars) + point), newbit, (ANTLR3_UINT32)(sizeof(ANTLR3_UINT16)*(len))); string->len += len; return string->chars; }
static pANTLR3_UINT8 insertUTF16_8 (pANTLR3_STRING string, ANTLR3_UINT32 point, const char * newbit) { ANTLR3_UINT32 len; ANTLR3_UINT32 count; pANTLR3_UINT16 inPoint; if (point >= string->len) { return string->append8(string, newbit); } len = (ANTLR3_UINT32)strlen(newbit); if (len == 0) { return string->chars; } if (string->size < (string->len + len + 1)) { string->chars = (pANTLR3_UINT8) ANTLR3_REALLOC((void *)string->chars, (ANTLR3_UINT32)(sizeof(ANTLR3_UINT16)*(string->len + len + 1))); string->size = string->len + len + 1; } /* Move the characters we are inserting before, including the delimiter */ ANTLR3_MEMMOVE((void *)(((pANTLR3_UINT16)string->chars) + point + len), (void *)(((pANTLR3_UINT16)string->chars) + point), (ANTLR3_UINT32)(sizeof(ANTLR3_UINT16)*(string->len - point + 1))); string->len += len; inPoint = ((pANTLR3_UINT16)(string->chars))+point; for (count = 0; count<len; count++) { *(inPoint + count) = (ANTLR3_UINT16)(*(newbit+count)); } return string->chars; }
/* Function that compares the text of a string with the supplied string * (which is assumed to be in the same encoding as the string itself) and returns a result * a la strcmp() */ static ANTLR3_UINT32 compareS (pANTLR3_STRING string, pANTLR3_STRING compStr) { return string->compare(string, (const char *)compStr->chars); }
static pANTLR3_UINT8 insertS (pANTLR3_STRING string, ANTLR3_UINT32 point, pANTLR3_STRING newbit) { return string->insert(string, point, (const char *)(newbit->chars)); }
static pANTLR3_UINT8 setS (pANTLR3_STRING string, pANTLR3_STRING chars) { return string->set(string, (const char *)(chars->chars)); }
static void defineDotEdges(pANTLR3_BASE_TREE_ADAPTOR adaptor, void * t, pANTLR3_STRING dotSpec) { // How many nodes are we talking about? // int nCount; int i; if (t == NULL) { // No tree, so do nothing // return; } // Count the nodes // nCount = adaptor->getChildCount(adaptor, t); if (nCount == 0) { // This will already have been included as a child of another node // so there is nothing to add. // return; } // For each child, define an edge from this parent, then process // and children of this child in the same way // for (i=0; i<nCount; i++) { pANTLR3_BASE_TREE child; char buff[128]; pANTLR3_STRING text; int j; // Next child // child = (pANTLR3_BASE_TREE)adaptor->getChild(adaptor, t, i); // Create the edge relation // sprintf(buff, "\t\tn%p -> n%p\t\t// ", t, child); dotSpec->append8(dotSpec, buff); // Document the relationship // text = adaptor->getText(adaptor, t); for (j = 0; j < (ANTLR3_INT32)(text->len); j++) { switch(text->charAt(text, j)) { case '"': dotSpec->append8(dotSpec, "\\\""); break; case '\n': dotSpec->append8(dotSpec, "\\n"); break; case '\r': dotSpec->append8(dotSpec, "\\r"); break; default: dotSpec->addc(dotSpec, text->charAt(text, j)); break; } } dotSpec->append8(dotSpec, " -> "); text = adaptor->getText(adaptor, child); for (j = 0; j < (ANTLR3_INT32)(text->len); j++) { switch(text->charAt(text, j)) { case '"': dotSpec->append8(dotSpec, "\\\""); break; case '\n': dotSpec->append8(dotSpec, "\\n"); break; case '\r': dotSpec->append8(dotSpec, "\\r"); break; default: dotSpec->addc(dotSpec, text->charAt(text, j)); break; } } dotSpec->append8(dotSpec, "\n"); // Define edges for this child // defineDotEdges(adaptor, child, dotSpec); } // Done // return; }
static void defineDotNodes(pANTLR3_BASE_TREE_ADAPTOR adaptor, void * t, pANTLR3_STRING dotSpec ) { // How many nodes are we talking about? // int nCount; int i; pANTLR3_BASE_TREE child; char buff[64]; pANTLR3_STRING text; int j; // Count the nodes // nCount = adaptor->getChildCount(adaptor, t); if (nCount == 0) { // This will already have been included as a child of another node // so there is nothing to add. // return; } // For each child of the current tree, define a node using the // memory address of the node to name it // for (i = 0; i<nCount; i++) { // Pick up a pointer for the child // child = (pANTLR3_BASE_TREE)adaptor->getChild(adaptor, t, i); // Name the node // sprintf(buff, "\tn%p[label=\"", child); dotSpec->append8(dotSpec, buff); text = adaptor->getText(adaptor, child); for (j = 0; j < (ANTLR3_INT32)(text->len); j++) { switch(text->charAt(text, j)) { case '"': dotSpec->append8(dotSpec, "\\\""); break; case '\n': dotSpec->append8(dotSpec, "\\n"); break; case '\r': dotSpec->append8(dotSpec, "\\r"); break; default: dotSpec->addc(dotSpec, text->charAt(text, j)); break; } } dotSpec->append8(dotSpec, "\"]\n"); // And now define the children of this child (if any) // defineDotNodes(adaptor, child, dotSpec); } // Done // return; }