cdesktopenv/cde/lib/DtHelp/CleanUp.c

331 lines
8.2 KiB
C

/*
* CDE - Common Desktop Environment
*
* Copyright (c) 1993-2012, The Open Group. All rights reserved.
*
* These libraries and programs are free software; you can
* redistribute them and/or modify them under the terms of the GNU
* Lesser General Public License as published by the Free Software
* Foundation; either version 2 of the License, or (at your option)
* any later version.
*
* These libraries and programs are distributed in the hope that
* they will be useful, but WITHOUT ANY WARRANTY; without even the
* implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
* PURPOSE. See the GNU Lesser General Public License for more
* details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with these librararies and programs; if not, write
* to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
* Floor, Boston, MA 02110-1301 USA
*/
/* $XConsortium: CleanUp.c /main/10 1996/01/29 12:19:40 cde-hp $ */
/************************************<+>*************************************
****************************************************************************
**
** File: CleanUp.c
**
** Project: Cde DtHelp
**
** Description:
**
** (c) Copyright 1987, 1988, 1989, 1990, 1991, 1992 Hewlett-Packard Company
**
** (c) Copyright 1993, 1994 Hewlett-Packard Company
** (c) Copyright 1993, 1994 International Business Machines Corp.
** (c) Copyright 1993, 1994 Sun Microsystems, Inc.
** (c) Copyright 1993, 1994 Novell, Inc.
**
**
****************************************************************************
************************************<+>*************************************/
/*
* system includes
*/
#include <stdlib.h>
#include <X11/Intrinsic.h>
/*
* Canvas Engine includes
*/
#include "CanvasP.h"
#include "CanvasSegP.h"
#include "LinkMgrP.h"
/*
* private includes
*/
#include "bufioI.h"
#include "CleanUpI.h"
#include "FontAttrI.h"
#include "FormatUtilI.h"
#include "RegionI.h"
#include "StringFuncsI.h"
#include "XInterfaceI.h"
#ifdef NLS16
#endif
/******** Private Function Declarations ********/
/******** End Private Function Declarations ********/
/*****************************************************************************
* Private Defines
*****************************************************************************/
/*****************************************************************************
* Private Macros
*****************************************************************************/
#define AbbrevStr(x) (FrmtPrivInfoPtr(x)->abbrev)
#define DupFlag(x) (FrmtPrivInfoPtr(x)->dup_flag)
#define MatchInfo(x) (FrmtPrivInfoPtr(x)->match_info)
#define TopFlag(x) (FrmtPrivInfoPtr(x)->top_block)
/*****************************************************************************
* Private Functions
*****************************************************************************/
static void
CheckFreePrivInfo(_DtCvSegment *seg)
{
/*
* free the match information
*/
if (NULL != MatchInfo(seg))
{
SdlMatchData *m = (SdlMatchData *)(MatchInfo(seg));
if (NULL != m->ssi)
free(m->ssi);
free(m);
}
/*
* free any abbreviation
*/
if (NULL != AbbrevStr(seg))
free(AbbrevStr(seg));
}
static void
FreePrivateAndSeg(_DtCvSegment *seg)
{
if (NULL != seg)
{
/*
* free the private information block
*/
if (NULL != FrmtPrivInfoPtr(seg))
free(FrmtPrivInfoPtr(seg));
/*
* free the segment block
*/
free(seg);
}
}
/*****************************************************************************
* Semi-Private Variables
*****************************************************************************/
/*****************************************************************************
* Semi-Public Functions
*****************************************************************************/
/*****************************************************************************
* Function: void _DtHelpFreeSegments (_DtCvSegment *seg_list)
*
* Parameters:
* seg_list Specifies the Canvas Engine segment list.
*
* Returns: Nothing
*
* Purpose: Free all memory associated with an SDL list.
*****************************************************************************/
void
_DtHelpFreeSegments (
_DtCvSegment *seg_list,
_DtCvStatus unresolved,
void (*destroy_region)(),
_DtCvPointer client_data)
{
int i;
char dupFlag;
char **strs;
_DtCvSegment *nextSeg;
_DtCvSegment *topSeg = NULL;
_DtCvSegment *topTab = NULL;
_DtCvSegment **tableSeg;
while (seg_list != NULL)
{
dupFlag = DupFlag(seg_list);
nextSeg = seg_list->next_seg;
switch (_DtCvPrimaryTypeOfSeg(seg_list))
{
case _DtCvCONTAINER:
/*
* free the id block.
*/
if (False == dupFlag &&
NULL != _DtCvContainerIdOfSeg(seg_list))
free(_DtCvContainerIdOfSeg(seg_list));
/*
* free the contents of the block
*/
_DtHelpFreeSegments(_DtCvContainerListOfSeg(seg_list),
unresolved,
destroy_region,
client_data);
break;
case _DtCvMARKER:
if (False == dupFlag)
free(_DtCvIdOfMarkerSeg(seg_list));
break;
case _DtCvREGION:
if (False == dupFlag && NULL != destroy_region)
(destroy_region)(client_data,
_DtCvInfoOfRegionSeg(seg_list));
break;
case _DtCvSTRING:
if (False == dupFlag)
{
free(_DtCvStringOfStringSeg(seg_list));
if (True == unresolved &&
NULL != _DtCvFontOfStringSeg(seg_list))
free(_DtCvFontOfStringSeg(seg_list));
}
break;
case _DtCvTABLE:
if (True == dupFlag)
break;
/*
* free the blocks
*/
tableSeg = _DtCvCellsOfTableSeg(seg_list);
while (NULL != tableSeg && NULL != *tableSeg)
{
/*
* free the id block.
*/
if (False == DupFlag(*tableSeg)
&& NULL != _DtCvContainerIdOfSeg(*tableSeg))
free(_DtCvContainerIdOfSeg(*tableSeg));
/*
* free the contents of the block
*/
_DtHelpFreeSegments(
_DtCvContainerListOfSeg(*tableSeg),
unresolved,
destroy_region,
client_data);
tableSeg++;
}
/*
* free each of the table cells
*/
tableSeg = _DtCvCellsOfTableSeg(seg_list);
while (NULL != tableSeg && NULL != *tableSeg)
{
if (True == TopFlag(*tableSeg))
{
FreePrivateAndSeg(topTab);
topTab = *tableSeg;
}
CheckFreePrivInfo(*tableSeg);
tableSeg++;
}
FreePrivateAndSeg(topTab);
topTab = NULL;
/*
* free the list of cells
*/
tableSeg = _DtCvCellsOfTableSeg(seg_list);
free (tableSeg);
/*
* free the row ids.
*/
_DtHelpCeFreeStringArray(
_DtCvCellIdsOfTableSeg(seg_list));
/*
* free the column justification and width.
*/
free((void *) _DtCvColJustifyOfTableSeg(seg_list));
strs = _DtCvColWOfTableSeg(seg_list);
for (i = 0;
NULL != strs && i < _DtCvNumColsOfTableSeg(seg_list);
i++, strs++)
free((void *) *strs);
if (NULL != _DtCvColWOfTableSeg(seg_list))
free((void *) _DtCvColWOfTableSeg(seg_list));
break;
}
CheckFreePrivInfo(seg_list);
if (True == TopFlag(seg_list))
{
FreePrivateAndSeg(topSeg);
topSeg = seg_list;
}
seg_list = nextSeg;
}
FreePrivateAndSeg(topSeg);
} /* End _DtHelpFreeSegments */
/*****************************************************************************
* Function: void _DtHelpDestroyTopicData (
* _DtCvSegment *seg_list)
*
* Parameters:
* seg_list Specifies the SDL segment list.
*
* Returns: Nothing
*
* Purpose: Free all memory associated with an SDL list.
*****************************************************************************/
void
_DtHelpDestroyTopicData (
_DtCvTopicInfo *topic,
void (*destroy_region)(),
_DtCvPointer client_data)
{
if (NULL != topic)
{
/*
* free the segment list
*/
_DtHelpFreeSegments(topic->seg_list, _DtCvFALSE,
destroy_region, client_data);
/*
* free the id string
*/
if (NULL != topic->id_str)
free(topic->id_str);
/*
* free the database
*/
_DtLinkDbDestroy(topic->link_data);
/*
* free the structure
*/
free(topic);
}
} /* End _DtHelpDestroyTopicData */