亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? mitab_idfile.cpp

?? mitab,讀取MapInfo的地圖文件
?? CPP
字號:
/**********************************************************************
 * $Id: mitab_idfile.cpp,v 1.8 2006/11/28 18:49:08 dmorissette Exp $
 *
 * Name:     mitab_idfile.cpp
 * Project:  MapInfo TAB Read/Write library
 * Language: C++
 * Purpose:  Implementation of the TABIDFile class used to handle
 *           reading/writing of the .ID file attached to a .MAP file
 * Author:   Daniel Morissette, dmorissette@dmsolutions.ca
 *
 **********************************************************************
 * Copyright (c) 1999, 2000, Daniel Morissette
 *
 * 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: mitab_idfile.cpp,v $
 * Revision 1.8  2006/11/28 18:49:08  dmorissette
 * Completed changes to split TABMAPObjectBlocks properly and produce an
 * optimal spatial index (bug 1585)
 *
 * Revision 1.7  2004/06/30 20:29:04  dmorissette
 * Fixed refs to old address danmo@videotron.ca
 *
 * Revision 1.6  2000/01/18 22:08:56  daniel
 * Allow opening of 0-size .ID file (dataset with 0 features)
 *
 * Revision 1.5  2000/01/15 22:30:44  daniel
 * Switch to MIT/X-Consortium OpenSource license
 *
 * Revision 1.4  1999/09/26 14:59:36  daniel
 * Implemented write support
 *
 * Revision 1.3  1999/09/20 18:43:01  daniel
 * Use binary acces to open file.
 *
 * Revision 1.2  1999/09/16 02:39:16  daniel
 * Completed read support for most feature types
 *
 * Revision 1.1  1999/07/12 04:18:24  daniel
 * Initial checkin
 *
 **********************************************************************/

#include "mitab.h"
#include "mitab_utils.h"

/*=====================================================================
 *                      class TABIDFile
 *====================================================================*/


/**********************************************************************
 *                   TABIDFile::TABIDFile()
 *
 * Constructor.
 **********************************************************************/
TABIDFile::TABIDFile()
{
    m_fp = NULL;
    m_pszFname = NULL;
    m_poIDBlock = NULL;
    m_nMaxId = -1;
}

/**********************************************************************
 *                   TABIDFile::~TABIDFile()
 *
 * Destructor.
 **********************************************************************/
TABIDFile::~TABIDFile()
{
    Close();
}

/**********************************************************************
 *                   TABIDFile::Open()
 *
 * Open a .ID file, and initialize the structures to be ready to read
 * objects from it.
 *
 * If the filename that is passed in contains a .MAP extension then
 * the extension will be changed to .ID before trying to open the file.
 *
 * Returns 0 on success, -1 on error.
 **********************************************************************/
int TABIDFile::Open(const char *pszFname, const char *pszAccess)
{
    int         nLen;

    if (m_fp)
    {
        CPLError(CE_Failure, CPLE_FileIO,
                 "Open() failed: object already contains an open file");
        return -1;
    }

    /*-----------------------------------------------------------------
     * Validate access mode and make sure we use binary access.
     * Note that in Write mode we need TABReadWrite since we do random
     * updates in the index as data blocks are split
     *----------------------------------------------------------------*/
    if (EQUALN(pszAccess, "r", 1))
    {
        m_eAccessMode = TABRead;
        pszAccess = "rb";
    }
    else if (EQUALN(pszAccess, "w", 1))
    {
        m_eAccessMode = TABReadWrite;
        pszAccess = "wb+";
    }
    else
    {
        CPLError(CE_Failure, CPLE_FileIO,
                 "Open() failed: access mode \"%s\" not supported", pszAccess);
        return -1;
    }

    /*-----------------------------------------------------------------
     * Change .MAP extension to .ID if necessary
     *----------------------------------------------------------------*/
    m_pszFname = CPLStrdup(pszFname);

    nLen = strlen(m_pszFname);
    if (nLen > 4 && strcmp(m_pszFname+nLen-4, ".MAP")==0)
        strcpy(m_pszFname+nLen-4, ".ID");
    else if (nLen > 4 && strcmp(m_pszFname+nLen-4, ".map")==0)
        strcpy(m_pszFname+nLen-4, ".id");

    /*-----------------------------------------------------------------
     * Change .MAP extension to .ID if necessary
     *----------------------------------------------------------------*/
#ifndef _WIN32
    TABAdjustFilenameExtension(m_pszFname);
#endif

    /*-----------------------------------------------------------------
     * Open file
     *----------------------------------------------------------------*/
    m_fp = VSIFOpen(m_pszFname, pszAccess);

    if (m_fp == NULL)
    {
        CPLError(CE_Failure, CPLE_FileIO,
                 "Open() failed for %s", m_pszFname);
        CPLFree(m_pszFname);
        m_pszFname = NULL;
        return -1;
    }

    if (m_eAccessMode == TABRead)
    {
        /*-------------------------------------------------------------
         * READ access:
         * Establish the number of object IDs from the size of the file
         *------------------------------------------------------------*/
        VSIStatBuf  sStatBuf;
        if ( VSIStat(m_pszFname, &sStatBuf) == -1 )
        {
            CPLError(CE_Failure, CPLE_FileIO, 
                     "stat() failed for %s\n", m_pszFname);
            Close();
            return -1;
        }

        m_nMaxId = sStatBuf.st_size/4;
        m_nBlockSize = MIN(1024, m_nMaxId*4);

        /*-------------------------------------------------------------
         * Read the first block from the file
         *------------------------------------------------------------*/
        m_poIDBlock = new TABRawBinBlock(m_eAccessMode, FALSE);

        if (m_nMaxId == 0)
        {
            // .ID file size = 0 ... just allocate a blank block but
            // it won't get really used anyways.
            m_nBlockSize = 512;
            m_poIDBlock->InitNewBlock(m_fp, m_nBlockSize, 0);
        }
        else if (m_poIDBlock->ReadFromFile(m_fp, 0, m_nBlockSize) != 0)
        {
            // CPLError() has already been called.
            Close();
            return -1;
        }
    }
    else
    {
        /*-------------------------------------------------------------
         * WRITE access:
         * Get ready to write to the file
         *------------------------------------------------------------*/
        m_poIDBlock = new TABRawBinBlock(m_eAccessMode, FALSE);
        m_nMaxId = 0;
        m_nBlockSize = 1024;
        m_poIDBlock->InitNewBlock(m_fp, m_nBlockSize, 0);
    }

    return 0;
}

/**********************************************************************
 *                   TABIDFile::Close()
 *
 * Close current file, and release all memory used.
 *
 * Returns 0 on success, -1 on error.
 **********************************************************************/
int TABIDFile::Close()
{
    if (m_fp == NULL)
        return 0;

    /*----------------------------------------------------------------
     * Write access: commit latest changes to the file.
     *---------------------------------------------------------------*/
    if (m_eAccessMode == TABReadWrite && m_poIDBlock)
    {
        m_poIDBlock->CommitToFile();
    }
    
    // Delete all structures 
    delete m_poIDBlock;
    m_poIDBlock = NULL;

    // Close file
    VSIFClose(m_fp);
    m_fp = NULL;

    CPLFree(m_pszFname);
    m_pszFname = NULL;

    return 0;
}


/**********************************************************************
 *                   TABIDFile::GetObjPtr()
 *
 * Return the offset in the .MAP file where the map object with the
 * specified id is located.
 *
 * Note that object ids are positive and start at 1.
 *
 * An object Id of '0' means that object has no geometry.
 *
 * Returns a value >= 0 on success, -1 on error.
 **********************************************************************/
GInt32 TABIDFile::GetObjPtr(GInt32 nObjId)
{
    if (m_poIDBlock == NULL)
        return -1;

    if (nObjId < 1 || nObjId > m_nMaxId)
    {
        CPLError(CE_Failure, CPLE_IllegalArg,
                 "GetObjPtr(): Invalid object ID %d (valid range is [1..%d])",
                 nObjId, m_nMaxId);
        return -1;
    }

    if (m_poIDBlock->GotoByteInFile( (nObjId-1)*4 ) != 0)
        return -1;

    return m_poIDBlock->ReadInt32();
}

/**********************************************************************
 *                   TABIDFile::SetObjPtr()
 *
 * Set the offset in the .MAP file where the map object with the
 * specified id is located.
 *
 * Note that object ids are positive and start at 1.
 *
 * An object Id of '0' means that object has no geometry.
 *
 * Returns a value of 0 on success, -1 on error.
 **********************************************************************/
int TABIDFile::SetObjPtr(GInt32 nObjId, GInt32 nObjPtr)
{
    if (m_poIDBlock == NULL)
        return -1;

    if (m_eAccessMode != TABReadWrite)
    {
        CPLError(CE_Failure, CPLE_NotSupported,
                 "SetObjPtr() can be used only with Write access.");
        return -1;
    }

    if (nObjId < 1)
    {
        CPLError(CE_Failure, CPLE_IllegalArg,
               "SetObjPtr(): Invalid object ID %d (must be greater than zero)",
                 nObjId);
        return -1;
    }

    /*-----------------------------------------------------------------
     * GotoByteInFile() will automagically commit current block and init
     * a new one if necessary.
     *----------------------------------------------------------------*/
    GInt32 nLastIdBlock = ((m_nMaxId-1)*4) / m_nBlockSize;
    GInt32 nTargetIdBlock = ((nObjId-1)*4) / m_nBlockSize;
    if (m_nMaxId > 0 && nTargetIdBlock <= nLastIdBlock)
    {
        /* Pass second arg to GotoByteInFile() to force reading from file
         * when going back to blocks already committed
         */
        if (m_poIDBlock->GotoByteInFile( (nObjId-1)*4, TRUE ) != 0)
            return -1;
    }
    else
    {
        /* If we reach EOF then a new empty block will have to be allocated
         */
        if (m_poIDBlock->GotoByteInFile( (nObjId-1)*4 ) != 0)
            return -1;
    }

    m_nMaxId = MAX(m_nMaxId, nObjId);

    return m_poIDBlock->WriteInt32(nObjPtr);
}


/**********************************************************************
 *                   TABIDFile::GetMaxObjId()
 *
 * Return the value of the biggest valid object id.
 *
 * Note that object ids are positive and start at 1.
 *
 * Returns a value >= 0 on success, -1 on error.
 **********************************************************************/
GInt32 TABIDFile::GetMaxObjId()
{
    return m_nMaxId;
}


/**********************************************************************
 *                   TABIDFile::Dump()
 *
 * Dump block contents... available only in DEBUG mode.
 **********************************************************************/
#ifdef DEBUG

void TABIDFile::Dump(FILE *fpOut /*=NULL*/)
{
    if (fpOut == NULL)
        fpOut = stdout;

    fprintf(fpOut, "----- TABIDFile::Dump() -----\n");

    if (m_fp == NULL)
    {
        fprintf(fpOut, "File is not opened.\n");
    }
    else
    {
        fprintf(fpOut, "File is opened: %s\n", m_pszFname);
        fprintf(fpOut, "Current index block follows ...\n\n");
        m_poIDBlock->Dump(fpOut);
        fprintf(fpOut, "... end of index block.\n\n");

    }

    fflush(fpOut);
}

#endif // DEBUG





?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品美女一区二区在线观看| 中文字幕一区免费在线观看| 成人app下载| 日韩精品国产精品| 国产精品久久久久婷婷二区次 | 972aa.com艺术欧美| 午夜一区二区三区视频| 中文字幕制服丝袜成人av| 欧美一区二区福利视频| 色欲综合视频天天天| 国产999精品久久| 美女尤物国产一区| 亚洲在线视频免费观看| 欧美韩国日本不卡| 精品久久人人做人人爰| 欧美日韩国产成人在线免费| 91亚洲大成网污www| 国产乱码精品一区二区三区忘忧草| 亚洲不卡在线观看| 亚洲男人电影天堂| 一区在线中文字幕| 国产丝袜在线精品| 欧美电影免费提供在线观看| 欧美综合在线视频| 91亚洲精品久久久蜜桃网站| 成人激情小说网站| 成人午夜av影视| 成人免费va视频| 国产xxx精品视频大全| 国产呦精品一区二区三区网站| 三级欧美韩日大片在线看| 亚洲激情图片一区| 亚洲人快播电影网| 亚洲欧美激情视频在线观看一区二区三区| 国产香蕉久久精品综合网| 久久综合色之久久综合| 国产亚洲综合色| 久久久久久久久久久99999| 日产国产欧美视频一区精品| 五月婷婷久久综合| 无吗不卡中文字幕| 青青草国产精品97视觉盛宴| 首页国产丝袜综合| 视频一区二区三区入口| 久久精品国产精品亚洲综合| 久久国产麻豆精品| 国产麻豆欧美日韩一区| 国产高清久久久久| av高清不卡在线| 欧美在线视频日韩| 日韩一区二区视频| 26uuu欧美| 欧美激情一区二区三区蜜桃视频| 国产精品久久久久久久久快鸭| 中文字幕一区二区三区乱码在线| 亚洲激情av在线| 视频一区免费在线观看| 久久99久久99精品免视看婷婷 | 偷拍日韩校园综合在线| 日本亚洲欧美天堂免费| 久久成人免费网| 波波电影院一区二区三区| 色视频欧美一区二区三区| 欧美日韩不卡一区| 久久久国产午夜精品| 中文字幕一区av| 午夜视频久久久久久| 黄一区二区三区| 99视频有精品| 69堂亚洲精品首页| 精品成人免费观看| 亚洲欧美日韩久久| 六月丁香婷婷久久| 色综合天天综合狠狠| 6080yy午夜一二三区久久| 国产午夜精品一区二区三区视频| 国产精品白丝在线| 奇米色777欧美一区二区| 粉嫩av亚洲一区二区图片| 日本高清不卡一区| 2020国产成人综合网| 亚洲女子a中天字幕| 麻豆91在线观看| 色八戒一区二区三区| 日韩欧美久久久| 亚洲男人的天堂av| 国产精品一区二区视频| 欧美在线观看视频在线| 国产日韩三级在线| 日韩黄色免费网站| 不卡欧美aaaaa| 日韩欧美一区在线| 亚洲精品国产视频| 国产麻豆精品在线| 在线成人免费视频| 成人aa视频在线观看| 日韩女优毛片在线| 夜夜嗨av一区二区三区| 国产剧情在线观看一区二区| 欧美三级中文字幕| 亚洲欧洲日韩在线| 国产九九视频一区二区三区| 欧美妇女性影城| 一区二区在线电影| 大胆亚洲人体视频| www国产成人| 日本不卡免费在线视频| 日本高清无吗v一区| 中文一区二区完整视频在线观看| 秋霞电影网一区二区| 精品视频在线免费看| 中文字幕字幕中文在线中不卡视频| 国产一区二区三区免费观看| 欧美一区二区大片| 婷婷国产在线综合| 欧美中文字幕不卡| 亚洲精品少妇30p| 91在线视频播放| 国产精品每日更新在线播放网址| 国产一区二区美女| 精品国产麻豆免费人成网站| 日本三级韩国三级欧美三级| 欧美图区在线视频| 一区二区不卡在线播放| 色婷婷av久久久久久久| 亚洲精品国产第一综合99久久 | 91麻豆福利精品推荐| 国产精品私人影院| 高清视频一区二区| 久久久不卡影院| 九色|91porny| 久久伊人中文字幕| 国产精品一区一区三区| 国产婷婷色一区二区三区四区 | 午夜精品一区二区三区免费视频 | 亚洲精品国产第一综合99久久| 91香蕉视频在线| 亚洲最快最全在线视频| 色狠狠色狠狠综合| 亚洲chinese男男1069| 欧美精品一卡二卡| 日韩不卡一二三区| 精品国产电影一区二区| 国产一区二区不卡在线| 日本一区二区不卡视频| 99麻豆久久久国产精品免费 | 亚洲精品高清在线观看| 色综合久久久久| 亚洲国产日韩在线一区模特 | 久久激情五月激情| 久久一夜天堂av一区二区三区| 国产suv精品一区二区6| 国产女人18水真多18精品一级做| 99久久免费国产| 一区二区三区高清| 日韩一区二区视频在线观看| 国产在线看一区| 亚洲色图清纯唯美| 91精品蜜臀在线一区尤物| 国产一区二区精品在线观看| 国产精品女主播在线观看| 91国产视频在线观看| 日韩高清不卡一区二区三区| 精品久久久久久久人人人人传媒| 粉嫩在线一区二区三区视频| 亚洲精品欧美二区三区中文字幕| 欧美久久久久免费| 国产精品一二一区| 一区二区三区四区精品在线视频 | 国产激情一区二区三区| 亚洲嫩草精品久久| 91精品久久久久久久91蜜桃| 国产精品一二三四| 亚洲成人黄色小说| 欧美国产日韩精品免费观看| 91福利精品视频| 紧缚捆绑精品一区二区| 亚洲视频在线一区| 精品日韩欧美一区二区| 99精品黄色片免费大全| 蜜臀av一区二区| 亚洲欧美日韩系列| 精品1区2区在线观看| 色婷婷综合在线| 精品亚洲成a人在线观看| 一区二区欧美在线观看| 2020日本不卡一区二区视频| 欧美色区777第一页| 成人精品一区二区三区四区| 日韩和欧美一区二区| 中文字幕一区二区三区乱码在线| 日韩欧美一区二区免费| 欧美午夜影院一区| 成人h版在线观看| 久久国产精品区| 亚洲成人av在线电影| 日韩一区欧美小说| 国产亚洲欧美日韩在线一区| 制服丝袜中文字幕亚洲| 91农村精品一区二区在线|