dupzap.c
来自「开放源码的编译器open watcom 1.6.0版的源代码」· C语言 代码 · 共 620 行 · 第 1/2 页
C
620 行
/****************************************************************************
*
* Open Watcom Project
*
* Portions Copyright (c) 1983-2002 Sybase, Inc. All Rights Reserved.
*
* ========================================================================
*
* This file contains Original Code and/or Modifications of Original
* Code as defined in and that are subject to the Sybase Open Watcom
* Public License version 1.0 (the 'License'). You may not use this file
* except in compliance with the License. BY USING THIS FILE YOU AGREE TO
* ALL TERMS AND CONDITIONS OF THE LICENSE. A copy of the License is
* provided with the Original Code and Modifications, and is also
* available at www.sybase.com/developer/opensource.
*
* The Original Code and all software distributed under the License are
* distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
* EXPRESS OR IMPLIED, AND SYBASE AND ALL CONTRIBUTORS HEREBY DISCLAIM
* ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR
* NON-INFRINGEMENT. Please see the License for the specific language
* governing rights and limitations under the License.
*
* ========================================================================
*
* Description: WHEN YOU FIGURE OUT WHAT THIS FILE DOES, PLEASE
* DESCRIBE IT HERE!
*
****************************************************************************/
#include <stdio.h>
#include <stdarg.h>
#include <stdlib.h>
#include <string.h>
#include "wic.h"
/*============== Duplicate functions ========================*/
static pTokPos _dupPos;
static pCTree _dupCTree(pCTree elem);
static pLabel _dupLabel(pLabel elem);
static pDeclInfo _dupDeclInfo(void *elem);
static pDclr _dupDclr(pDclr elem);
static pDeclStructInfo _dupDeclStructInfo(pDeclStructInfo elem);
static pDeclStructBody _dupDeclStructBody(pDeclStructBody elem);
static pArrElem _dupArrElem(pArrElem elem);
static pDclrPtr _dupDclrPtr(pDclrPtr elem);
static pDeclEnum _dupDeclEnum(pDeclEnum elem);
static pEnumElem _dupEnumElem(void *elem);
static pToken _dupToken(pToken elem);
static pTokPos _dupTokPos(pTokPos elem);
static pTokData _dupTokData(pTokData elem);
static void _zapTokData(pTokData elem);
#define _dupSLList dupSLList
static pCTree _dupCTree(pCTree elem) {
pCTree newElem;
if (elem == NULL) {
return NULL;
}
newElem = wicMalloc(sizeof *newElem);
newElem->label = _dupLabel(elem->label);
newElem->child1 = _dupCTree(elem->child1);
newElem->child2 = _dupCTree(elem->child2);
return newElem;
}
static pLabel _dupLabel(pLabel elem) {
pLabel newElem;
if (elem == NULL) {
return NULL;
}
newElem = wicMalloc(sizeof *newElem);
newElem->type = elem->type;
switch (elem->type) {
case LABT_LIST:
newElem->repr.list = _dupSLList(elem->repr.list, (void *(*)(void *))_dupToken);
break;
case LABT_TOKEN:
newElem->repr.token = _dupToken(elem->repr.token);
break;
case LABT_CONSTRUCT_ROOT:
{
int size = elem->repr.constr.numTokens;
int i;
memcpy(&(newElem->repr.constr), &(elem->repr.constr),
sizeof elem->repr.constr);
if (size > 0) {
newElem->repr.constr.tokens = wicMalloc(size *
sizeof newElem->repr.constr.tokens[0]);
}
for (i = 0; i < size; i++) {
newElem->repr.constr.tokens[i] =
_dupToken(elem->repr.constr.tokens[i]);
}
}
break;
case LABT_DECL_INFO:
newElem->repr.dinfo = _dupDeclInfo(elem->repr.dinfo);
break;
case LABT_DECL_LIST:
newElem->repr.declList =
_dupSLList(elem->repr.declList, (void *(*)(void *))_dupDeclInfo);
break;
default:
assert(0);
}
return newElem;
}
static pDeclInfo _dupDeclInfo(void *_elem) {
pDeclInfo elem = _elem;
pDeclInfo newElem;
if (elem == NULL) {
return NULL;
}
newElem = wicMalloc(sizeof *newElem);
memcpy(newElem, elem, sizeof *newElem);
newElem->begPunct = _dupToken(elem->begPunct);
newElem->prefixPos = _dupTokPos(elem->prefixPos);
switch(elem->type) {
case DIT_SCALAR:
newElem->repr.scalar.scalarPos =
_dupTokPos(elem->repr.scalar.scalarPos);
break;
case DIT_STRUCT_OR_UNION:
newElem->repr.s = _dupDeclStructInfo(elem->repr.s);
break;
case DIT_ENUM:
newElem->repr.e = _dupDeclEnum(elem->repr.e);
break;
case DIT_NULL:
break;
default:
break;
}
newElem->dclrList = _dupSLList(elem->dclrList, (void *(*)(void *))_dupDclr);
newElem->dclr = _dupDclr(elem->dclr);
return newElem;
}
static pDclr _dupDclr(pDclr elem) {
pDclr newElem;
if (elem == NULL) {
return NULL;
}
newElem = wicMalloc(sizeof *newElem);
memcpy(newElem, elem, sizeof *newElem);
newElem->memType = elem->memType;
newElem->memPos = _dupTokPos(elem->memPos);
newElem->pragmaMod = _dupToken(elem->pragmaMod);
newElem->ptr = _dupDclrPtr(elem->ptr);
newElem->id = _dupToken(elem->id);
newElem->arrList = _dupSLList(elem->arrList, (void *(*)(void *))_dupArrElem);
newElem->argBegin = _dupToken(elem->argBegin);
newElem->args = _dupSLList(elem->args, (void *(*)(void *))_dupDeclInfo);
newElem->argEnd = _dupToken(elem->argEnd);
newElem->equalTok = _dupToken(elem->equalTok);
newElem->initializer = _dupCTree(elem->initializer);
return newElem;
}
static pDeclStructInfo _dupDeclStructInfo(pDeclStructInfo elem) {
pDeclStructInfo newElem;
if (elem == NULL) {
return NULL;
}
newElem = wicMalloc(sizeof *newElem);
memcpy(newElem, elem, sizeof *newElem);
newElem->type = elem->type;
newElem->typePos = _dupTokPos(elem->typePos);
newElem->name = _dupToken(elem->name);
newElem->body = _dupDeclStructBody(elem->body);
return newElem;
}
static pDeclStructBody _dupDeclStructBody(pDeclStructBody elem) {
pDeclStructBody newElem;
if (elem == NULL) {
return NULL;
}
newElem = wicMalloc(sizeof *newElem);
memcpy(newElem, elem, sizeof *newElem);
newElem->declList = _dupSLList(elem->declList, (void *(*)(void *))_dupDeclInfo);
newElem->endPos = _dupTokPos(elem->endPos);
return newElem;
}
static pArrElem _dupArrElem(pArrElem elem) {
pArrElem newElem;
if (elem == NULL) {
return NULL;
}
newElem = wicMalloc(sizeof *newElem);
newElem->lBracket = _dupToken(elem->lBracket);
newElem->constExpr = _dupCTree(elem->constExpr);
newElem->rBracket = _dupToken(elem->rBracket);
return newElem;
}
static pDclrPtr _dupDclrPtr(pDclrPtr elem) {
pDclrPtr newElem;
if (elem == NULL) {
return NULL;
}
newElem = wicMalloc(sizeof *newElem);
memcpy(newElem, elem, sizeof *newElem);
newElem->memType = elem->memType;
newElem->qualifiers = elem->qualifiers;
newElem->pos = _dupTokPos(elem->pos);
return newElem;
}
static pDeclEnum _dupDeclEnum(pDeclEnum elem) {
pDeclEnum newElem;
if (elem == NULL) {
return NULL;
}
newElem = wicMalloc(sizeof *newElem);
memcpy(newElem, elem, sizeof *newElem);
newElem->enumPos = _dupTokPos(elem->enumPos);
newElem->list = _dupSLList(elem->list, (void *(*)(void *))_dupEnumElem);
return newElem;
}
static pEnumElem _dupEnumElem(void *_elem) {
pEnumElem elem = _elem;
pEnumElem newElem;
if (elem == NULL) {
return NULL;
}
newElem = wicMalloc(sizeof *newElem);
memcpy(newElem, elem, sizeof *newElem);
newElem->name = _dupToken(elem->name);
newElem->equal = _dupToken(elem->equal);
newElem->expression = _dupCTree(elem->expression);
return newElem;
}
static pToken _dupToken(pToken elem) {
pToken newElem;
if (elem == NULL) {
return NULL;
}
newElem = wicMalloc(sizeof *newElem);
memcpy(newElem, elem, sizeof *newElem);
newElem->data = _dupTokData(elem->data);
newElem->pos = _dupTokPos(elem->pos);
return newElem;
}
static pTokData _dupTokData(pTokData elem) {
pTokData newElem;
if (elem == NULL) {
return NULL;
}
newElem = wicMalloc(sizeof *newElem);
memcpy(newElem, elem, sizeof *newElem);
if (elem->code == Y_NUMBER) {
// Nothing to copy
} else if (elem->code == Y_STRING) {
newElem->repr.s.s = wicMalloc(elem->repr.s.strLen);
memcpy(newElem->repr.s.s, elem->repr.s.s, elem->repr.s.strLen);
} else {
registerString(elem->repr.string, !FREE_STRING);
}
return newElem;
}
static int _firstPosChange;
static pTokPos _dupTokPos(pTokPos elem) {
pTokPos newElem;
pTokPos temp;
int saveSpacesBefore, saveLinesBefore;
if (elem == NULL) {
return NULL;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?