cdesktopenv/cde/programs/dtdocbook/infolib/OL_Data.C

271 lines
5.8 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 libraries and programs; if not, write
* to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
* Floor, Boston, MA 02110-1301 USA
*/
/* $XConsortium: OL_Data.C /main/4 1996/08/21 15:47:10 drk $
*
* (c) Copyright 1996 Digital Equipment Corporation.
* (c) Copyright 1996 Hewlett-Packard Company.
* (c) Copyright 1996 International Business Machines Corp.
* (c) Copyright 1996 Sun Microsystems, Inc.
* (c) Copyright 1996 Novell, Inc.
* (c) Copyright 1996 FUJITSU LIMITED.
* (c) Copyright 1996 Hitachi.
*/
/* exported interfaces */
#include "OL_Data.h"
/* imported interfaces */
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include <misc/unique_id.h>
#include "Expression.h"
#include "AttributeRec.h"
#include "OLAF.h"
#include "SGMLName.h"
#include "Token.h"
#include "Task.h"
#include "Dispatch.h"
#include "SGMLDefn.h"
#include "AttributeData.h"
#include "Content.h"
#include "FirstOf.h"
#include "GenericId.h"
#include "Literal.h"
#include "ConcatTask.h"
// Debugging macro
#ifdef DEBUG
#define DBG(level) if ( dbgLevel >= level)
#else
#define DBG(level) if (0)
#endif
static int dbgLevel=-1;
//---------------------------------------------------------------------------
static char *
FilteredSpaces( const char *str )
{
char *head;
char *tail = (char *)str + strlen( str ) - 1;
char *ptr = (char *)str;
while (1) {
if ( *ptr != ' ' && *ptr != '\n' && *ptr != '\t' ) {
head = ptr;
break;
}
else {
ptr++;
}
}
while (1) {
if ( *tail != ' ' && *tail != '\n' && *tail != '\t' ) {
*(tail + 1) = '\0';
break;
}
else { tail--; }
}
return ( head );
}
//-------------------------------------------------------------------------
OL_Data::OL_Data( const Token &t,
int DataType,
ActionType mode ):BaseData(t,mode)
{
char *dbgStr;
dbgStr = getenv("OL_DEBUG");
dbgLevel = ( dbgStr ? atoi ( dbgStr ) : 0 );
/* first generate grep all the mode info */
istat = mode & IGNORE_ON;
removeSpaces = mode & REMOVE_SPACES;
f_name = strdup( t.file() );
line_num = t.line();
if ( istat && !Dispatch::OutsideIgnoreScope() ) {
data_avail = 0;
return;
}
const AttributeRec *attRec;
if ( !(attRec = t.LookupAttr( DataType )) ) {
if ( mode & GENERATE_ID ) {
const char *str = unique_id();
ValueBuffer.writeStr( str );
data_avail = 1;
data_complete = 1;
}
else {
/*
* The default rule kicks in, i.e use #CONTENT
*/
addSubTask( new Content( t, mode) );
}
return;
}
tokContent.Parse( ( char *)attRec->getAttrValueString() );
const OL_Expression *eptr = tokContent.exprlist;
assert(eptr != NULL);
switch ( eptr->type() ) {
case REFERENCE:
{
BaseData *sub_data = new AttributeData(t, eptr->name(), mode );
if ( sub_data ) {
if ( (data_avail= sub_data->DataWillBeAvailable()) ) {
ValueBuffer.write( sub_data->content(),
sub_data->content_size() );
data_complete = 1;
}
delete sub_data;
}
}
break;
case CONTENT:
addSubTask( new Content(t, mode) );
break;
case CONCAT:
addSubTask( new Concat( t,
(ExprList *)eptr->data_list(),
mode) );
break;
case FIRSTOF:
addSubTask( new FirstOf( t,
(ExprList *)eptr->data_list(),
mode) );
break;
case GENERIC_ID:
addSubTask( new GenericId( t,
eptr->name(),
mode) );
break;
case LITERAL:
data_avail = 1;
data_complete = 1;
ValueBuffer.writeStr( ( const char *)eptr->data_list() );
break;
default:
abort();
}
}
//-------------------------------------------------------------------------
void
OL_Data::markup( const Token &t )
{
DBG(80) cerr << "(DEBUG) OL_Data::markup() " << endl;
DBG(80) cerr << " t.giName() = " << t.giName() << endl;
if ( istat && !Dispatch::OutsideIgnoreScope() ) {
return;
}
if ( f_base > 0 ) {
ComplexTask::markup( t );
if ( t.type() == END ) {
if ( f_base == t.level() ) {
data_complete = 1;
for ( int i=0; i < ComplexTask::used; i++ ) {
BaseData *task = ( BaseData *)ComplexTask::subtask(i);
ValueBuffer.write( task->content(), task->content_size() );
}
if ( removeSpaces && ValueBuffer.GetSize() > 0 ) {
const char *filtered_string = FilteredSpaces( ValueBuffer.GetBuffer() );
/* rewrite ValueBuffer with the filtered string */
ValueBuffer.reset();
ValueBuffer.writeStr( filtered_string );
}
DBG(10) printf("Data for <%s> = %s\n", t.giName(),
ValueBuffer.GetBuffer() );
reset();
}
}
} /* if level > 0 */
}
//-------------------------------------------------------------------------
void
OL_Data::data( const char *str, size_t t )
{
if ( istat && !Dispatch::OutsideIgnoreScope() ) {
return;
}
if ( f_base > 0 ) {
ComplexTask::data( str, t );
}
}
//-------------------------------------------------------------------------
void
OL_Data::reset()
{
f_base = -1;
istat = removeSpaces = 0;
removeAllSubTasks();
}