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

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

?? nmeap01.c

?? GARMIN的GPS信息解釋器
?? C
?? 第 1 頁 / 共 2 頁
字號:
/*
Copyright (c) 2005, David M Howard (daveh at dmh2000.com)
All rights reserved.

This product is licensed for use and distribution under the BSD Open Source License.
see the file COPYING for more details.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, 
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT 
OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 
OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 
WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 
OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, 
EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 

*/

/**
 * nmeap01.c
 * nmeap gps data parser
 * 
 * see the file COPYING for terms of the licnese
*/ 
 
 
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include <ctype.h>
#include "nmeap.h"

/* this only works if you are sure you have an upper case hex digit */
#define HEXTOBIN(ch) ((ch <= '9') ? ch - '0' : ch - ('A' - 10))

/* forward references */
int nmeap_init(nmeap_context_t *context,void *user_data);
int nmeap_addParser(nmeap_context_t         *context,
					 const char             *sentence_name,
					 nmeap_sentence_parser_t sentence_parser,
					 nmeap_callout_t         sentence_callout,
                     void                  *sentence_data
					 );
int nmeap_tokenize(nmeap_context_t *context);
int nmeap_process(nmeap_context_t *context);
int nmeap_parse(nmeap_context_t *context,char ch);
int nmeap_parseBuffer(nmeap_context_t *context,const char *buffer,int *length);

/**
 * get a latitude out of a pair of nmea tokens 
 */
double nmeap_latitude(const char *plat,const char *phem)
{
    double lat;
    int    deg;
    double min;
    int    ns;
    
    assert(plat != 0);
    assert(phem != 0);
    
    if (*plat == 0) {
        return 0.0;
    }
    if (*phem == 0) {
        return 0.0;
    }
    
    /* north lat is +, south lat is - */
    if (*phem == 'N') {
        ns = 1;
    }
    else {
        ns = -1;
    }
    
    /* latitude is degrees, minutes, fractional minutes */
    /* no validation is performed on the token. it better be good.*/
    /* if it comes back 0.0 then probably the token was bad */
    lat = atof(plat);
    
    /* extract the degree part */
    deg = (int)(lat / 100.0);
    
    /* mask out the degrees */
    min = lat - (deg * 100.0);
    
    /* compute the actual latitude in degrees.decimal-degrees */
    lat = (deg + (min / 60.0)) * ns;
    
    return lat;
}

/**
 * get a longitude out of a pair of nmea tokens 
 */
double nmeap_longitude(const char *plon,const char *phem)
{
    double lon;
    int    deg;
    double min;
    int    ew;
    
    assert(plon != 0);
    assert(phem != 0);
    
    if (*plon == 0) {
        return 0.0;
    }
    if (*phem == 0) {
        return 0.0;
    }
    
    /* west long is negative, east long is positive */
    if (*phem == 'E') {
        ew = 1;
    }
    else {
        ew = -1;
    }
    
    /* longitude is degrees, minutes, fractional minutes */
    /* no validation is performed on the token. it better be good.*/
    /* if it comes back 0.0 then probably the token was bad */
    lon = atof(plon);
    
    /* extract the degree part */
    deg = (int)(lon / 100.0);
    
    /* mask out the degrees */
    min = lon - (deg * 100.0);
    
    /* compute the actual lonitude in degrees.decimal-degrees */
    lon = (deg + (min / 60.0)) * ew;

    
    return lon;
}

/**
 * get an altitude longitude out of a pair of nmea tokens
 * ALTITUDE is returned in METERS 
 */
double nmeap_altitude(const char *palt,const char *punits)
{
    double alt;
    
    if (*palt == 0) {
        return 0.0;
    }
    
    /* convert with no error checking */
    alt = atof(palt);
    
    if (*punits == 'M') {
        /* already in meters */ 
    }
    else if (*punits == 'F') {
        /* convert to feet */
        alt = alt * 3.2808399;
    }
    
    return alt;
}

/**
 * initialize an NMEA parser
 */
int nmeap_init(nmeap_context_t *context,void *user_data)
{
    assert(context != 0);

    memset(context,0,sizeof(*context));

    context->user_data = user_data;

    return 0;    
}

 
/**
 * register an NMEA sentence parser
 */
int nmeap_addParser(nmeap_context_t         *context,
					 const char             *sentence_name,
					 nmeap_sentence_parser_t sentence_parser,
					 nmeap_callout_t         sentence_callout,
                     void                  *sentence_data
					 )
{
    nmeap_sentence_t *s = 0;
    
    /* runtime error */
    assert(context != 0);
    
    /* sentence capacity overflow */
    if (context->sentence_count >= NMEAP_MAX_SENTENCES) {
        return -1;
    }
    
    /* point at next empty sentence buffer */
    s = &context->sentence[context->sentence_count];
    
    /* advance sentence data count */
    context->sentence_count++;
    
    /* clear the sentence data */
    memset(s,0,sizeof(*s));
    
    /* name */
    strncpy(s->name,sentence_name,NMEAP_MAX_SENTENCE_NAME_LENGTH);
    
    /* parser */
    s->parser = sentence_parser;
    
    /* callout */
    s->callout = sentence_callout;
    
    /* data */
    s->data    = sentence_data;

    return 0;
}

/** 
 * tokenize a buffer
 */
int nmeap_tokenize(nmeap_context_t *context)
{
    char *s;
    int   tokens;
    int   state;
    
    /* first token is header. assume it is there */
    tokens = 0;
    s = context->input;
    context->token[tokens] = s;
    
    /* get rest of tokens */
    tokens = 1;
    state = 0;
    while((*s != 0)&&(tokens < NMEAP_MAX_TOKENS)) {
        switch(state) {
        case 0:
            /* looking for end of a token */
            if (*s == ',') {
                /* delimit at the comma */
                *s    = 0;
                /* new token */
                state = 1;
            }
            break;
        case 1:
            /* start of next token, might be another comma */
            context->token[tokens++] = s;
            if (*s == ',') {
                /* delimit at the comma */
                *s    = 0;
            }
            else {   
                /* not a comma */
                state = 0;
            }
            break;
        default:
            state = 0;
            break;
        }
        
        // next character
        s++;
    }
    return tokens;
}

/**
 * process a sentence 
 */
int nmeap_process(nmeap_context_t *context)
{
    int id;
    int i;
    nmeap_sentence_t *s;
	
    /* copy the input to a debug buffer */
    /* remove debug_input when everything is working. */
    strncpy(context->debug_input,context->input,sizeof(context->debug_input));
    
    /* tokenize the input */
    context->tokens = nmeap_tokenize(context);
    
    /* try to find a matching sentence parser */
    /* this search is O(n). it has a lot of potential for optimization, at the expense of complexity, if you have a lot of sentences */
    /* binary search instead of linear (have to keep sentences in sorted order) O(NlogN) */
    /* OR, when sentences are added, create a TRIE structure to find the names with a constant time search O(5) */
    for(i=0;i<context->sentence_count;i++) {
        s = &context->sentence[i];
        assert(s != 0);
        if (strncmp(context->input_name,s->name,5) == 0) {
            /* found a match, call its parser */
            id = (*context->sentence[i].parser)(context,s);
            if (id > 0) {
                break;
            }
        }
    }
        

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产成人在线视频网站| 99在线精品视频| 欧美精彩视频一区二区三区| 精品视频一区二区三区免费| 国产乱对白刺激视频不卡| 午夜私人影院久久久久| 国产精品毛片高清在线完整版| 欧美人妖巨大在线| 日本道精品一区二区三区| 狠狠色丁香九九婷婷综合五月| 亚洲三级在线观看| 久久久噜噜噜久噜久久综合| 91精品国产欧美一区二区18| 91麻豆视频网站| 懂色av噜噜一区二区三区av| 毛片一区二区三区| 亚洲aⅴ怡春院| 亚洲欧美一区二区三区久本道91| 国产亚洲短视频| 欧美电影免费观看高清完整版在线 | 中文字幕不卡三区| 日韩欧美资源站| 欧美久久一区二区| 欧美性欧美巨大黑白大战| 99视频精品全部免费在线| 国产精品69久久久久水密桃| 黄色日韩三级电影| 日本美女视频一区二区| 亚洲一区二区欧美激情| 亚洲色图欧洲色图| 日韩一区中文字幕| 国产精品久久久久影院色老大| 久久色视频免费观看| xfplay精品久久| 精品免费日韩av| 日韩视频一区二区| 91精品国产综合久久久蜜臀图片| 欧美性受xxxx黑人xyx| 欧美视频你懂的| 欧美日本一道本| 欧美高清一级片在线| 欧美精品乱码久久久久久按摩| 欧美午夜影院一区| 欧美日韩在线精品一区二区三区激情| 久久综合精品国产一区二区三区 | 欧美精品一二三区| 欧美久久久久久久久中文字幕| 欧美亚洲高清一区二区三区不卡| 欧美亚洲一区二区三区四区| 欧美性大战久久| 8x福利精品第一导航| 日韩一级黄色片| 26uuu色噜噜精品一区二区| 久久影院午夜片一区| 中文字幕欧美日本乱码一线二线| 国产精品色一区二区三区| 国产精品看片你懂得| 亚洲欧美日本在线| 午夜精品久久久久久久99樱桃| 视频在线观看一区| 狠狠色狠狠色综合系列| 成人免费黄色大片| 91农村精品一区二区在线| 欧美最猛黑人xxxxx猛交| 91精品在线观看入口| 精品国产亚洲在线| 欧美高清在线精品一区| 一区二区三区四区中文字幕| 性感美女久久精品| 韩国v欧美v日本v亚洲v| 大桥未久av一区二区三区中文| 在线精品视频免费播放| 欧美一区二区黄色| 国产清纯在线一区二区www| 亚洲女人小视频在线观看| 天天色图综合网| 国产一区二区三区四区五区美女| 99这里都是精品| 91精品在线免费观看| 亚洲国产成人午夜在线一区| 香蕉影视欧美成人| 欧美一级一区二区| 国产欧美中文在线| 亚洲在线观看免费| 国产精品一区二区三区99| 色av成人天堂桃色av| 2020国产精品久久精品美国| 樱桃视频在线观看一区| 精品一区二区三区不卡| 一本一道综合狠狠老| 26uuu国产电影一区二区| 亚洲国产一区二区三区青草影视| 国产一区二区精品久久| 欧美无砖砖区免费| 中文字幕一区二区视频| 麻豆久久久久久久| 欧美在线看片a免费观看| 国产亚洲1区2区3区| 午夜亚洲福利老司机| 99久久夜色精品国产网站| 欧美成人一区二区三区| 亚洲一区二区偷拍精品| 顶级嫩模精品视频在线看| 欧美一区二区三区在线观看视频| 亚洲免费色视频| 成人在线一区二区三区| 日韩午夜激情av| 亚洲福利一区二区| 色综合中文字幕国产| 久久精品亚洲精品国产欧美kt∨| 丝袜美腿高跟呻吟高潮一区| 91香蕉视频污| 国产女主播在线一区二区| 免费观看成人鲁鲁鲁鲁鲁视频| 97se亚洲国产综合自在线不卡| 国产三级欧美三级日产三级99| 日本伊人精品一区二区三区观看方式 | 懂色av中文字幕一区二区三区 | 丝袜诱惑制服诱惑色一区在线观看| 风间由美一区二区av101 | 久久久亚洲国产美女国产盗摄 | 国产欧美日韩视频一区二区| 男男gaygay亚洲| 欧美日韩国产片| 一区二区三区精品视频| 97精品电影院| 国产精品毛片无遮挡高清| 国产成人综合网站| 久久综合999| 蜜桃久久精品一区二区| 欧美一区午夜精品| 青青草97国产精品免费观看无弹窗版 | 亚洲一级二级在线| 色久综合一二码| 亚洲男女一区二区三区| 色综合天天视频在线观看| **欧美大码日韩| 91在线国内视频| 亚洲欧美在线视频观看| 色综合久久久久综合99| 综合色中文字幕| 日本韩国精品在线| 亚洲图片欧美色图| 一本大道久久a久久综合婷婷| 综合激情网...| 91免费版在线看| 亚洲午夜激情av| 欧美日韩一级黄| 日韩电影在线一区二区| 日韩精品一区二区三区视频在线观看| 日韩成人一级大片| 久久天天做天天爱综合色| 成人午夜激情影院| 中文字幕色av一区二区三区| 日本精品免费观看高清观看| 亚洲午夜日本在线观看| 综合欧美亚洲日本| 在线观看免费一区| 另类人妖一区二区av| 久久久精品天堂| 97精品久久久午夜一区二区三区| 一区二区三区四区不卡在线 | 日韩高清不卡一区二区三区| 日韩色视频在线观看| 国产精品亚洲视频| 亚洲人被黑人高潮完整版| 5566中文字幕一区二区电影 | 成人av网址在线观看| 亚洲精选免费视频| 欧美xxxx在线观看| 99久久久国产精品免费蜜臀| 首页国产欧美久久| 中日韩免费视频中文字幕| 欧美无乱码久久久免费午夜一区| 久久精品国产秦先生| 亚洲欧洲精品一区二区精品久久久| 欧美日韩午夜在线视频| 国产一区二区不卡在线| 亚洲精品自拍动漫在线| 欧美大片一区二区三区| 波多野结衣中文字幕一区| 天天色综合成人网| 国产精品国产精品国产专区不蜜| 欧美浪妇xxxx高跟鞋交| 丰满放荡岳乱妇91ww| 亚洲国产cao| 中文字幕免费一区| 欧美猛男男办公室激情| 成人18视频在线播放| 蜜桃视频一区二区三区在线观看| 亚洲视频一区在线观看| 亚洲精品在线一区二区| 欧洲一区在线电影| 成人网在线播放| 久久精品国产亚洲aⅴ| 亚洲一区二区三区爽爽爽爽爽| 国产午夜亚洲精品不卡| 欧美挠脚心视频网站| 9久草视频在线视频精品| 蜜臀av国产精品久久久久|