⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ddfsubfielddefn.cpp

📁 开源的电子海图程序
💻 CPP
📖 第 1 页 / 共 3 页
字号:
/****************************************************************************** * $Id: ddfsubfielddefn.cpp,v 1.1.1.1 2004/12/29 07:54:56 jay-be-em Exp $ * * Project:  ISO 8211 Access * Purpose:  Implements the DDFSubfieldDefn class. * Author:   Frank Warmerdam, warmerda@home.com * ****************************************************************************** * Copyright (c) 1999, Frank Warmerdam * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included * in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. ****************************************************************************** * * $Log: ddfsubfielddefn.cpp,v $ * Revision 1.1.1.1  2004/12/29 07:54:56  jay-be-em * Initial import * * Revision 1.13  2004/01/06 19:07:14  warmerda * Added braces within complex case in switch for HP/UX compatibility. * * Revision 1.12  2003/12/15 20:24:58  warmerda * expand tabs * * Revision 1.11  2003/11/12 21:22:14  warmerda * fixed some docs * * Revision 1.10  2003/09/05 19:13:45  warmerda * added format support for binary ints * * Revision 1.9  2003/09/03 20:36:26  warmerda * added subfield writing support * * Revision 1.8  2001/07/18 04:51:57  warmerda * added CPL_CVSID * * Revision 1.7  2000/09/19 14:09:34  warmerda * avoid checking for field terminators in multi-byte strings * * Revision 1.6  2000/06/13 13:39:27  warmerda * added warnings, and better handlng of short data for subfields * * Revision 1.5  1999/11/18 19:03:04  warmerda * expanded tabs * * Revision 1.4  1999/05/10 17:36:23  warmerda * Strip trailing spaces off subfield names. * * Revision 1.3  1999/05/06 15:15:07  warmerda * Removed extra break; * * Revision 1.2  1999/05/06 14:25:43  warmerda * added DDFBinaryString, and a bit of optimization * * Revision 1.1  1999/04/27 18:45:05  warmerda * New * */#include "iso8211.h"#include "cpl_conv.h"CPL_CVSID("$Id: ddfsubfielddefn.cpp,v 1.1.1.1 2004/12/29 07:54:56 jay-be-em Exp $");/************************************************************************//*                          DDFSubfieldDefn()                           *//************************************************************************/DDFSubfieldDefn::DDFSubfieldDefn(){    pszName = NULL;        bIsVariable = TRUE;    nFormatWidth = 0;    chFormatDelimeter = DDF_UNIT_TERMINATOR;    eBinaryFormat = NotBinary;    eType = DDFString;        pszFormatString = CPLStrdup("");    nMaxBufChars = 0;    pachBuffer = NULL;}/************************************************************************//*                          ~DDFSubfieldDefn()                          *//************************************************************************/DDFSubfieldDefn::~DDFSubfieldDefn(){    CPLFree( pszName );    CPLFree( pszFormatString );    CPLFree( pachBuffer );}/************************************************************************//*                              SetName()                               *//************************************************************************/void DDFSubfieldDefn::SetName( const char * pszNewName ){    int         i;        CPLFree( pszName );    pszName = CPLStrdup( pszNewName );    for( i = strlen(pszName)-1; i > 0 && pszName[i] == ' '; i-- )        pszName[i] = '\0';}/************************************************************************//*                             SetFormat()                              *//*                                                                      *//*      While interpreting the format string we don't support:          *//*                                                                      *//*       o Passing an explicit terminator for variable length field.    *//*       o 'X' for unused data ... this should really be filtered       *//*         out by DDFFieldDefn::ApplyFormats(), but isn't.              *//*       o 'B' bitstrings that aren't a multiple of eight.              *//************************************************************************/int DDFSubfieldDefn::SetFormat( const char * pszFormat ){    CPLFree( pszFormatString );    pszFormatString = CPLStrdup( pszFormat );/* -------------------------------------------------------------------- *//*      These values will likely be used.                               *//* -------------------------------------------------------------------- */    if( pszFormatString[1] == '(' )    {        nFormatWidth = atoi(pszFormatString+2);        bIsVariable = nFormatWidth == 0;    }    else        bIsVariable = TRUE;    /* -------------------------------------------------------------------- *//*      Interpret the format string.                                    *//* -------------------------------------------------------------------- */    switch( pszFormatString[0] )    {      case 'A':      case 'C':         // It isn't clear to me how this is different than 'A'        eType = DDFString;        break;      case 'R':        eType = DDFFloat;        break;              case 'I':      case 'S':        eType = DDFInt;        break;      case 'B':      case 'b':        // Is the width expressed in bits? (is it a bitstring)        bIsVariable = FALSE;        if( pszFormatString[1] == '(' )        {            CPLAssert( atoi(pszFormatString+2) % 8 == 0 );                        nFormatWidth = atoi(pszFormatString+2) / 8;            eBinaryFormat = SInt; // good default, works for SDTS.            if( nFormatWidth < 5 )                eType = DDFInt;            else                eType = DDFBinaryString;        }                // or do we have a binary type indicator? (is it binary)        else        {            eBinaryFormat = (DDFBinaryFormat) (pszFormatString[1] - '0');            nFormatWidth = atoi(pszFormatString+2);            if( eBinaryFormat == SInt || eBinaryFormat == UInt )                eType = DDFInt;            else                eType = DDFFloat;        }        break;      case 'X':        // 'X' is extra space, and shouldn't be directly assigned to a        // subfield ... I haven't encountered it in use yet though.        CPLError( CE_Failure, CPLE_AppDefined,                  "Format type of `%c' not supported.\n",                  pszFormatString[0] );                CPLAssert( FALSE );        return FALSE;              default:        CPLError( CE_Failure, CPLE_AppDefined,                  "Format type of `%c' not recognised.\n",                  pszFormatString[0] );                CPLAssert( FALSE );        return FALSE;    }        return TRUE;}/************************************************************************//*                                Dump()                                *//************************************************************************//** * Write out subfield definition info to debugging file. * * A variety of information about this field definition is written to the * give debugging file handle. * * @param fp The standard io file handle to write to.  ie. stderr */void DDFSubfieldDefn::Dump( FILE * fp ){    fprintf( fp, "    DDFSubfieldDefn:\n" );    fprintf( fp, "        Label = `%s'\n", pszName );    fprintf( fp, "        FormatString = `%s'\n", pszFormatString );}/************************************************************************//*                           GetDataLength()                            *//*                                                                      *//*      This method will scan for the end of a variable field.          *//************************************************************************//** * Scan for the end of variable length data.  Given a pointer to the data * for this subfield (from within a DDFRecord) this method will return the * number of bytes which are data for this subfield.  The number of bytes * consumed as part of this field can also be fetched.  This number may * be one longer than the length if there is a terminator character * used.<p> * * This method is mainly for internal use, or for applications which * want the raw binary data to interpret themselves.  Otherwise use one * of ExtractStringData(), ExtractIntData() or ExtractFloatData(). * * @param pachSourceData The pointer to the raw data for this field.  This * may have come from DDFRecord::GetData(), taking into account skip factors * over previous subfields data. * @param nMaxBytes The maximum number of bytes that are accessable after * pachSourceData. * @param pnConsumedBytes Pointer to an integer into which the number of * bytes consumed by this field should be written.  May be NULL to ignore. * * @return The number of bytes at pachSourceData which are actual data for * this record (not including unit, or field terminator).   */int DDFSubfieldDefn::GetDataLength( const char * pachSourceData,                                    int nMaxBytes, int * pnConsumedBytes ){    if( !bIsVariable )    {        if( nFormatWidth > nMaxBytes )        {            CPLError( CE_Warning, CPLE_AppDefined,                       "Only %d bytes available for subfield %s with\n"                      "format string %s ... returning shortened data.",                      nMaxBytes, pszName, pszFormatString );            if( pnConsumedBytes != NULL )                *pnConsumedBytes = nMaxBytes;            return nMaxBytes;        }        else        {            if( pnConsumedBytes != NULL )                *pnConsumedBytes = nFormatWidth;            return nFormatWidth;        }    }    else    {        int     nLength = 0;        int     bCheckFieldTerminator = TRUE;        /* We only check for the field terminator because of some buggy          * datasets with missing format terminators.  However, we have found         * the field terminator is a legal character within the fields of         * some extended datasets (such as JP34NC94.000).  So we don't check         * for the field terminator if the field appears to be multi-byte         * which we established by the first character being out of the          * ASCII printable range (32-127).          */        if( pachSourceData[0] < 32 || pachSourceData[0] >= 127 )            bCheckFieldTerminator = FALSE;                while( nLength < nMaxBytes               && pachSourceData[nLength] != chFormatDelimeter )        {            if( bCheckFieldTerminator                 && pachSourceData[nLength] == DDF_FIELD_TERMINATOR )                break;            nLength++;        }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -