/* * The rvalue of an equation is a string. Set values and return. */ char * expr_STRING(char *st, char *cs, int CompoundString) { char s[256]; int i; FontSet *fs = (FontSet *) cs; char *FontName = NULL; if (fs) { FontName = fs->fontset.name; } for (i = 0; *st; i++) { if ('\\' == *st) { st++; while (*st && isdigit(*st)) { s[i] = s[i] * 10 + *st++ - '0'; } if (*st != '\\') { __MrmExit(LOC, "String ERROR\n"); } st++; } else { s[i] = *st++; } } s[i] = 0; st = s; if (CompoundString) { return (char *)CStringNew(st, FontName, 0, 0); } else { StripQuotes(st); return (char *)CStringNew(st, FontName, 0, 0); } }
char * expr_STRING_Compound(char *st, int Separate, int IsAddress) { if (!IsAddress) { StripQuotes(st); } return (char *)CStringNew(st, NULL, IsAddress, Separate); }
void gsp_addJoinItem(gsp_sqlparser *parser, gsp_selectStatement* select, char* text){ if(select!=NULL && select->fromTableList!=NULL){ gsp_list *items = select->fromTableList; gsp_fromTable *item = (gsp_fromTable *)malloc(sizeof(gsp_fromTable)); gsp_listcell *cell = (gsp_listcell *)malloc(sizeof(gsp_listcell)); gsp_fromTable *lastItem = NULL; gsp_listcell *lastCell = NULL; gsp_sourcetoken *endToken = NULL; gsp_sourcetoken *fromToken = NULL; CString* content = CStringNew(); collectMallocMemroy(parser,item); collectMallocMemroy(parser, cell); fromToken = gsp_getSelectFromToken(select); if(select->fromTableList->length>0){ lastItem = (gsp_fromTable *)gsp_list_last(items); lastCell = items->tail; endToken = lastItem->fragment.endToken; } else{ if(fromToken!=NULL) endToken = fromToken; else if(select->resultColumnList!=NULL && select->resultColumnList->length>0){ endToken = (gsp_list_last(select->resultColumnList))->fragment.endToken; } else{ endToken = select->selectToken; } } if(select->fromTableList->length>0) CStringAppend(content, "," ); else if(fromToken == NULL){ if(startsWithIgnoreCase(trimString(text), "FROM")){ CStringAppend(content, " " ); } else CStringAppend(content, " FROM " ); } else CStringAppend(content, " " ); CStringAppend(content, text ); collectMallocMemroy(parser, content->buffer); cell->node = (gsp_node*)item; if(lastCell!=NULL){ cell->pNext = lastCell->pNext; cell->pPrev = lastCell->pPrev; cell->nodeType = lastCell->nodeType; } else{ cell->pPrev = (gsp_node*)select->fromTableList; cell->pNext = NULL; cell->nodeType = t_gsp_listcell; } cell->fragment.startToken = NULL; cell->fragment.endToken = NULL; cell->fragment.text = NULL; cell->nextCell = NULL; if(lastCell!=NULL){ lastCell->nextCell = cell; } else{ items->head = cell; } items->tail = cell; items->length+=1; item->pNext = NULL; item->pPrev = NULL; item->aliasClause = NULL; item->tableExpr = NULL; item->functionCall = NULL; item->joinExpr = NULL; item->aliasClause = NULL; item->fromtableType = ets_objectname; item->nodeType = t_gsp_join; item->fragment.startToken = NULL; item->fragment.endToken = NULL; item->fragment.text = NULL; gsp_setNodeText(parser, (gsp_node*)item, content->buffer, FALSE); adjustNodeTokensPosition((gsp_node*)item, endToken); if(lastItem!=NULL){ item->pPrev = (gsp_node *)lastItem; item->pNext = lastItem->pNext; lastItem->pNext = (gsp_node*)item; if(item->pNext!=NULL) item->pNext->pPrev = (gsp_node*)item; } { gsp_node *currentNode = (gsp_node*)select->fromTableList; gsp_node *node = currentNode->pNext; while(node!=NULL){ gsp_node *temp = node->pNext; if(gsp_isInnerNode(node, currentNode)){ if(node->nodeType == t_gsp_join || node->nodeType == t_gsp_objectname || node->nodeType == t_gsp_functionCall || node->nodeType == t_gsp_fromTable || node->nodeType == t_gsp_table ||node->nodeType == t_gsp_expr) continue; if(node->fragment.endToken == endToken) node->fragment.endToken = item->fragment.endToken; } node = temp; } node = (gsp_node*)currentNode->pPrev; while(node!=NULL){ gsp_node *temp = node->pPrev; if(gsp_isInnerNode(node, currentNode)){ if(node->nodeType == t_gsp_join || node->nodeType == t_gsp_objectname || node->nodeType == t_gsp_functionCall || node->nodeType == t_gsp_fromTable || node->nodeType == t_gsp_table ||node->nodeType == t_gsp_expr) continue; if(node->fragment.endToken == endToken) node->fragment.endToken = item->fragment.endToken; } node = temp; } } CStringDeleteWithoutBuffer(content); } }
void gsp_addWhereClause( gsp_sqlparser *parser, gsp_base_statement* stmt, char* text ) { gsp_selectStatement* select = NULL; gsp_updateStatement* update = NULL; gsp_deleteStatement* deleteStmt = NULL; gsp_whereClause *whereClause = NULL; if(stmt->nodeType == t_gsp_selectStatement){ select = (gsp_selectStatement*)stmt; whereClause = select->whereCondition; } else if(stmt->nodeType == t_gsp_updateStatement){ update = (gsp_updateStatement*)stmt; whereClause = update->whereCondition; } else if(stmt->nodeType == t_gsp_deleteStatement){ deleteStmt = (gsp_deleteStatement*)stmt; whereClause = deleteStmt->whereCondition; } if(whereClause!=NULL && whereClause->condition!=NULL){ gsp_expr *expr = whereClause->condition; int startPos = gsp_getNodeStartToken((gsp_node*)expr)->nPosInList; int endPos = gsp_getNodeEndToken((gsp_node*)expr)->nPosInList; gsp_sourcetoken* endToken = expr->fragment.endToken; CString* content = CStringNew(); char* exprText = gsp_getNodeText((gsp_node*)whereClause->condition); CStringAppend(content, exprText); if(endsWithIgnoreCase(exprText, " ") || endsWithIgnoreCase(exprText, "\n") || endsWithIgnoreCase(exprText, "\t")){ CStringAppend(content, "AND " ); } else{ CStringAppend(content, " AND " ); } CStringAppend(content, text ); gsp_setNodeText(parser, (gsp_node*)whereClause->condition, content->buffer, FALSE); { gsp_node *currentNode = (gsp_node*)expr; gsp_node *node = currentNode->pNext; while(node!=NULL){ gsp_node *temp = node->pNext; if(gsp_isInNodeRange(node, startPos, endPos)){ if(node->fragment.endToken == endToken) node->fragment.endToken = expr->fragment.endToken; } node = temp; } node = (gsp_node*)currentNode->pPrev; while(node!=NULL){ gsp_node *temp = node->pPrev; if(gsp_isInNodeRange(node, startPos, endPos)){ if(node->fragment.endToken == endToken) node->fragment.endToken = expr->fragment.endToken; } node = temp; } } CStringDeleteWithoutBuffer(content); } else{ gsp_sourcetoken *endToken = NULL; gsp_node* currentNode = NULL; CString* content = CStringNew(); BOOL isEndTerminate = FALSE; if(!startsWithIgnoreCase(trimString(text), "WHERE ")){ CStringAppend(content, " WHERE "); } else CStringAppend(content, " "); CStringAppend(content, text); whereClause = (gsp_whereClause *)malloc(sizeof(gsp_whereClause)); whereClause->nodeType = t_gsp_whereClause; whereClause->fragment.startToken = NULL; whereClause->fragment.endToken = NULL; whereClause->fragment.text = NULL; whereClause->condition = NULL; whereClause->pNext = NULL; whereClause->pPrev = NULL; collectMallocMemroy(parser, whereClause); collectMallocMemroy(parser, content->buffer); gsp_setNodeText(parser, (gsp_node*)whereClause, content->buffer, FALSE); if(select!=NULL){ if(select->fromTableList!=NULL && select->fromTableList->length>0){ endToken = (gsp_list_last(select->fromTableList))->fragment.endToken; } else if(select->groupByClause!=NULL){ endToken = select->groupByClause->fragment.startToken->pPrev; } else if(select->orderbyClause!=NULL){ endToken = select->orderbyClause->fragment.startToken->pPrev; } else if(select->resultColumnList!=NULL && select->resultColumnList->length>0){ endToken = (gsp_list_last(select->resultColumnList))->fragment.endToken; } else{ endToken = select->fragment.endToken; } } else if(update!=NULL){ if(update->resultColumnList!=NULL && update->resultColumnList->length>0){ endToken = (gsp_list_last(update->resultColumnList))->fragment.endToken; } else{ endToken = select->fragment.endToken; } } else if(deleteStmt!=NULL){ endToken = deleteStmt->fragment.endToken; } if(endToken->pNext == NULL) isEndTerminate = TRUE; adjustNodeTokensPosition((gsp_node*)whereClause, endToken); currentNode = (gsp_node *)select; { gsp_node *node = currentNode->pNext; while(node!=NULL){ gsp_node *temp = node->pNext; if(gsp_isInnerNode(node, currentNode)){ if(node->fragment.endToken == endToken) node->fragment.endToken = whereClause->fragment.endToken; } node = temp; } node = (gsp_node*)currentNode->pPrev; while(node!=NULL){ gsp_node *temp = node->pPrev; if(gsp_isInnerNode(node, currentNode)){ if(node->fragment.endToken == endToken) node->fragment.endToken = whereClause->fragment.endToken; } node = temp; } if(isEndTerminate) currentNode->fragment.endToken = whereClause->fragment.endToken; } select->whereCondition = whereClause; CStringDeleteWithoutBuffer(content); } }
void gsp_addHavingClause( gsp_sqlparser *parser, gsp_selectStatement* select, char* text ){ if(select->groupByClause == NULL) return; if(select->groupByClause->havingClause !=NULL) gsp_removeHavingClause(select); { gsp_sourcetoken *endToken; gsp_node* currentNode; CString* content = CStringNew(); gsp_sourcetoken *havingToken = NULL; gsp_sourcetoken *currentToken; gsp_expr *havingClause; gsp_groupBy* groupby = select->groupByClause; if(!startsWithIgnoreCase(trimString(text), "HAVING ")){ CStringAppend(content, " HAVING "); } else CStringAppend(content, " "); CStringAppend(content, text); havingClause = (gsp_expr *)malloc(sizeof(gsp_expr)); havingClause->nodeType = t_gsp_expr; havingClause->fragment.startToken = NULL; havingClause->fragment.endToken = NULL; havingClause->fragment.text = NULL; havingClause->pNext = NULL; havingClause->pPrev = NULL; collectMallocMemroy(parser, havingClause); collectMallocMemroy(parser, content->buffer); gsp_setNodeText(parser, (gsp_node*)havingClause, content->buffer, FALSE); currentToken = havingClause->fragment.startToken; while(currentToken!=havingClause->fragment.endToken){ if(startsWithIgnoreCase(currentToken->pStr, "HAVING ")){ havingToken = currentToken; break; } currentToken = currentToken->pNext; } groupby->stHaving = havingToken; groupby->havingClause = havingClause; endToken = groupby->fragment.endToken; adjustNodeTokensPosition((gsp_node*)havingClause, endToken); currentNode = (gsp_node *)groupby; { gsp_node *node = currentNode->pNext; while(node!=NULL){ gsp_node *temp = node->pNext; if(gsp_isInnerNode(node, currentNode)){ if(node->fragment.endToken == endToken) node->fragment.endToken = havingClause->fragment.endToken; } node = temp; } node = (gsp_node*)currentNode->pPrev; while(node!=NULL){ gsp_node *temp = node->pPrev; if(gsp_isInnerNode(node, currentNode)){ if(node->fragment.endToken == endToken) node->fragment.endToken = havingClause->fragment.endToken; } node = temp; } currentNode->fragment.endToken = havingClause->fragment.endToken; } if(havingToken!=NULL){ havingClause->pNext = (gsp_node*)groupby; havingClause->pPrev = groupby->pPrev; } CStringDeleteWithoutBuffer(content); } }
void gsp_addGroupBy( gsp_sqlparser *parser, gsp_selectStatement* select, char* text ) { gsp_groupBy *groupby = select->groupByClause; if(groupby!=NULL && groupby->items!=NULL){ gsp_list *items = groupby->items; gsp_gruopByItem *lastItem = (gsp_gruopByItem *)gsp_list_last(items); gsp_listcell *lastCell = items->tail; gsp_sourcetoken *endToken = lastItem->fragment.endToken; gsp_gruopByItem *item = (gsp_gruopByItem *)malloc(sizeof(gsp_gruopByItem)); gsp_listcell *cell = (gsp_listcell *)malloc(sizeof(gsp_listcell)); CString* content = CStringNew(); CStringAppend(content, "," ); CStringAppend(content, text ); collectMallocMemroy(parser, item); collectMallocMemroy(parser, cell); collectMallocMemroy(parser, content->buffer); cell->node = (gsp_node*)item; cell->pNext = lastCell->pNext; cell->pPrev = lastCell->pPrev; cell->nodeType = lastCell->nodeType; cell->fragment.startToken = NULL; cell->fragment.endToken = NULL; cell->fragment.text = NULL; cell->nextCell = NULL; lastCell->nextCell = cell; items->tail = cell; item->pNext = NULL; item->pPrev = NULL; item->aliasClause = NULL; item->groupingSet = NULL; item->rollupCube = NULL; item->expr = NULL; item->nodeType = t_gsp_gruopByItem; item->fragment.startToken = NULL; item->fragment.endToken = NULL; item->fragment.text = NULL; gsp_setNodeText(parser, (gsp_node*)item, content->buffer, FALSE); adjustNodeTokensPosition((gsp_node*)item, endToken); item->pPrev = (gsp_node *)lastItem; item->pNext = lastItem->pNext; lastItem->pNext = (gsp_node*)item; if(item->pNext!=NULL) item->pNext->pPrev = (gsp_node*)item; if(groupby->havingClause == NULL) { gsp_node *currentNode = (gsp_node*)groupby; gsp_node *node = currentNode->pNext; while(node!=NULL){ gsp_node *temp = node->pNext; if(gsp_isInnerNode(node, currentNode)){ if(node->nodeType == t_gsp_gruopByItem || node->nodeType == t_gsp_objectname ||node->nodeType == t_gsp_expr) continue; if(node->fragment.endToken == endToken) node->fragment.endToken = item->fragment.endToken; } node = temp; } node = (gsp_node*)currentNode->pPrev; while(node!=NULL){ gsp_node *temp = node->pPrev; if(gsp_isInnerNode(node, currentNode)){ if(node->nodeType == t_gsp_gruopByItem || node->nodeType == t_gsp_objectname ||node->nodeType == t_gsp_expr) continue; if(node->fragment.endToken == endToken) node->fragment.endToken = item->fragment.endToken; } node = temp; } currentNode->fragment.endToken = item->fragment.endToken; } CStringDeleteWithoutBuffer(content); } else{ gsp_sourcetoken *endToken; gsp_node* currentNode; CString* content = CStringNew(); gsp_sourcetoken *havingToken = NULL; gsp_sourcetoken *currentToken; BOOL isEndTerminate = FALSE; if(!startsWithIgnoreCase(trimString(text), "GROUP ")){ CStringAppend(content, " GROUP BY "); } else CStringAppend(content, " "); CStringAppend(content, text); groupby = (gsp_groupBy *)malloc(sizeof(gsp_groupBy)); groupby->nodeType = t_gsp_groupBy; groupby->fragment.startToken = NULL; groupby->fragment.endToken = NULL; groupby->fragment.text = NULL; groupby->items = NULL; groupby->pNext = NULL; groupby->pPrev = NULL; groupby->havingClause = NULL; groupby->stBy = NULL; groupby->stGroup = NULL; groupby->stHaving = NULL; collectMallocMemroy(parser, groupby); collectMallocMemroy(parser, content->buffer); gsp_setNodeText(parser, (gsp_node*)groupby, content->buffer, FALSE); currentToken = groupby->fragment.startToken; while(currentToken!=groupby->fragment.endToken){ if(startsWithIgnoreCase(currentToken->pStr, "HAVING ")){ havingToken = currentToken; break; } currentToken = currentToken->pNext; } groupby->stHaving = havingToken; if(select->orderbyClause!=NULL){ endToken = select->orderbyClause->fragment.startToken->pPrev; } else if(select->whereCondition!=NULL){ endToken = select->whereCondition->fragment.endToken; } else if(select->fromTableList!=NULL){ endToken = (gsp_list_last(select->fromTableList))->fragment.endToken; } else{ endToken = select->fragment.endToken; } if(endToken->pNext == NULL) isEndTerminate = TRUE; adjustNodeTokensPosition((gsp_node*)groupby, endToken); currentNode = (gsp_node *)select; { gsp_node *node = currentNode->pNext; while(node!=NULL){ gsp_node *temp = node->pNext; if(gsp_isInnerNode(node, currentNode)){ if(node->fragment.endToken == endToken) node->fragment.endToken = groupby->fragment.endToken; } node = temp; } node = (gsp_node*)currentNode->pPrev; while(node!=NULL){ gsp_node *temp = node->pPrev; if(gsp_isInnerNode(node, currentNode)){ if(node->fragment.endToken == endToken) node->fragment.endToken = groupby->fragment.endToken; } node = temp; } if(isEndTerminate) currentNode->fragment.endToken = groupby->fragment.endToken; } if(havingToken!=NULL){ gsp_expr *havingClause = (gsp_expr *)malloc(sizeof(gsp_expr)); havingClause->nodeType = t_gsp_expr; currentToken = havingToken->pNext; while(currentToken!=NULL && strlen(trimString(currentToken->pStr))==0){ currentToken = currentToken->pNext; } havingClause->fragment.startToken = currentToken; havingClause->fragment.endToken = groupby->fragment.endToken; havingClause->fragment.text = NULL; havingClause->pNext = (gsp_node*)groupby; havingClause->pPrev = (gsp_node*)select; collectMallocMemroy(parser, havingClause); } select->groupByClause = groupby; CStringDeleteWithoutBuffer(content); } }
void gsp_addOrderBy( gsp_sqlparser *parser, gsp_selectStatement* select, char* text ) { gsp_orderBy *orderby = select->orderbyClause; if(orderby!=NULL && orderby->items!=NULL){ gsp_list *items = orderby->items; gsp_orderByItem *lastItem = (gsp_orderByItem *)gsp_list_last(items); gsp_listcell *lastCell = items->tail; gsp_sourcetoken *endToken = lastItem->fragment.endToken; gsp_orderByItem *item = (gsp_orderByItem *)malloc(sizeof(gsp_orderByItem)); gsp_listcell *cell = (gsp_listcell *)malloc(sizeof(gsp_listcell)); CString* content = CStringNew(); CStringAppend(content, "," ); CStringAppend(content, text ); collectMallocMemroy(parser, item); collectMallocMemroy(parser, cell); collectMallocMemroy(parser, content->buffer); cell->node = (gsp_node*)item; cell->pNext = lastCell->pNext; cell->pPrev = lastCell->pPrev; cell->nodeType = lastCell->nodeType; cell->fragment.startToken = NULL; cell->fragment.endToken = NULL; cell->fragment.text = NULL; cell->nextCell = NULL; lastCell->nextCell = cell; items->tail = cell; items->length+=1; item->pNext = NULL; item->pPrev = NULL; item->sortToken = NULL; item->nodeType = t_gsp_orderByItem; item->fragment.startToken = NULL; item->fragment.endToken = NULL; item->fragment.text = NULL; gsp_setNodeText(parser, (gsp_node*)item, content->buffer, FALSE); adjustNodeTokensPosition((gsp_node*)item, endToken); item->pPrev = (gsp_node *)lastItem; item->pNext = lastItem->pNext; lastItem->pNext = (gsp_node*)item; if(item->pNext!=NULL) item->pNext->pPrev = (gsp_node*)item; { gsp_node *currentNode = (gsp_node*)orderby; gsp_node *node = currentNode->pNext; while(node!=NULL){ gsp_node *temp = node->pNext; if(gsp_isInnerNode(node, currentNode)){ if(node->nodeType == t_gsp_orderByItem || node->nodeType == t_gsp_objectname ||node->nodeType == t_gsp_expr) continue; if(node->fragment.endToken == endToken) node->fragment.endToken = item->fragment.endToken; } node = temp; } node = (gsp_node*)currentNode->pPrev; while(node!=NULL){ gsp_node *temp = node->pPrev; if(gsp_isInnerNode(node, currentNode)){ if(node->nodeType == t_gsp_orderByItem || node->nodeType == t_gsp_objectname ||node->nodeType == t_gsp_expr) continue; if(node->fragment.endToken == endToken) node->fragment.endToken = item->fragment.endToken; } node = temp; } currentNode->fragment.endToken = item->fragment.endToken; } CStringDeleteWithoutBuffer(content); } else{ gsp_sourcetoken *endToken; gsp_node* currentNode; CString* content = CStringNew(); BOOL isEndTerminate = FALSE; if(!startsWithIgnoreCase(trimString(text), "ORDER ")){ CStringAppend(content, " ORDER BY "); } else CStringAppend(content, " "); CStringAppend(content, text); orderby = (gsp_orderBy *)malloc(sizeof(gsp_orderBy)); orderby->nodeType = t_gsp_orderBy; orderby->fragment.startToken = NULL; orderby->fragment.endToken = NULL; orderby->fragment.text = NULL; orderby->items = NULL; orderby->pNext = NULL; orderby->pPrev = NULL; collectMallocMemroy(parser, orderby); collectMallocMemroy(parser, content->buffer); gsp_setNodeText(parser, (gsp_node*)orderby, content->buffer, FALSE); if(select->groupByClause!=NULL){ if(select->groupByClause->havingClause!=NULL){ endToken = select->groupByClause->havingClause->fragment.endToken; } else{ endToken = select->groupByClause->fragment.endToken; } } else if(select->whereCondition!=NULL){ endToken = select->whereCondition->fragment.endToken; } else if(select->fromTableList!=NULL){ endToken = (gsp_list_last(select->fromTableList))->fragment.endToken; } else{ endToken = select->fragment.endToken; } if(endToken->pNext == NULL) isEndTerminate = TRUE; adjustNodeTokensPosition((gsp_node*)orderby, endToken); currentNode = (gsp_node *)select; { gsp_node *node = currentNode->pNext; while(node!=NULL){ gsp_node *temp = node->pNext; if(gsp_isInnerNode(node, currentNode)){ if(node->fragment.endToken == endToken) node->fragment.endToken = orderby->fragment.endToken; } node = temp; } node = (gsp_node*)currentNode->pPrev; while(node!=NULL){ gsp_node *temp = node->pPrev; if(gsp_isInnerNode(node, currentNode)){ if(node->fragment.endToken == endToken) node->fragment.endToken = orderby->fragment.endToken; } node = temp; } if(isEndTerminate) currentNode->fragment.endToken = orderby->fragment.endToken; } select->orderbyClause = orderby; CStringDeleteWithoutBuffer(content); } }
void gsp_addResultColumn(gsp_sqlparser *parser, gsp_base_statement* stmt, char* text){ gsp_selectStatement* select = NULL; gsp_updateStatement* update = NULL; gsp_list *resultColumnList = NULL; if(stmt->nodeType == t_gsp_selectStatement){ select = (gsp_selectStatement*)stmt; resultColumnList = select->resultColumnList; } else if(stmt->nodeType == t_gsp_updateStatement){ update = (gsp_updateStatement*)stmt; resultColumnList = update->resultColumnList; } if(resultColumnList!=NULL){ gsp_list *items = resultColumnList; gsp_resultColumn *item = (gsp_resultColumn *)malloc(sizeof(gsp_resultColumn)); gsp_listcell *cell = (gsp_listcell *)malloc(sizeof(gsp_listcell)); gsp_resultColumn *lastItem = NULL; gsp_listcell *lastCell = NULL; gsp_sourcetoken *endToken = NULL; CString* content = CStringNew(); if(items->length>0) CStringAppend(content, "," ); else CStringAppend(content, " " ); CStringAppend(content, text ); collectMallocMemroy(parser, item); collectMallocMemroy(parser, cell); collectMallocMemroy(parser, content->buffer); if(items->length>0){ lastItem = (gsp_resultColumn *)gsp_list_last(items); lastCell = items->tail; endToken = lastItem->fragment.endToken; } else{ if(select!=NULL) endToken = select->selectToken; else if(update!=NULL) endToken = update->updateToken; } cell->node = (gsp_node*)item; if(lastCell!=NULL){ cell->pNext = lastCell->pNext; cell->pPrev = lastCell->pPrev; cell->nodeType = lastCell->nodeType; } else{ cell->pPrev = (gsp_node*)items; cell->pNext = NULL; cell->nodeType = t_gsp_listcell; } cell->fragment.startToken = NULL; cell->fragment.endToken = NULL; cell->fragment.text = NULL; cell->nextCell = NULL; if(lastCell!=NULL){ lastCell->nextCell = cell; } else{ items->head = cell; } items->tail = cell; items->length+=1; item->pNext = NULL; item->pPrev = NULL; item->aliasClause = NULL; item->expr = NULL; item->nodeType = t_gsp_resultColumn; item->fragment.startToken = NULL; item->fragment.endToken = NULL; item->fragment.text = NULL; gsp_setNodeText(parser, (gsp_node*)item, content->buffer, FALSE); adjustNodeTokensPosition((gsp_node*)item, endToken); if(lastItem!=NULL){ item->pPrev = (gsp_node *)lastItem; item->pNext = lastItem->pNext; lastItem->pNext = (gsp_node*)item; if(item->pNext!=NULL) item->pNext->pPrev = (gsp_node*)item; } { gsp_node *currentNode = (gsp_node*)items; gsp_node *node = currentNode->pNext; while(node!=NULL){ gsp_node *temp = node->pNext; if(gsp_isInnerNode(node, currentNode)){ if(node->nodeType == t_gsp_resultColumn || node->nodeType == t_gsp_objectname || node->nodeType == t_gsp_functionCall ||node->nodeType == t_gsp_expr) continue; if(node->fragment.endToken == endToken) node->fragment.endToken = item->fragment.endToken; } node = temp; } node = (gsp_node*)currentNode->pPrev; while(node!=NULL){ gsp_node *temp = node->pPrev; if(gsp_isInnerNode(node, currentNode)){ if(node->nodeType == t_gsp_resultColumn || node->nodeType == t_gsp_objectname || node->nodeType == t_gsp_functionCall ||node->nodeType == t_gsp_expr) continue; if(node->fragment.endToken == endToken) node->fragment.endToken = item->fragment.endToken; } node = temp; } } CStringDeleteWithoutBuffer(content); } }