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

📄 myformat.c

📁 一个很不错的GPS接收机源程序
💻 C
字号:
/* * * NMEA library * URL: http://nmea.sourceforge.net * Author: Tim (xtimor@gmail.com) * Licence: http://www.gnu.org/licenses/lgpl.html * $Id: tok.c 4 2007-08-27 13:11:03Z xtimor $ * *//*! \file tok.h */#include <stdarg.h>#include <stdlib.h>#include <stdio.h>#include <ctype.h>#include <string.h>#include <limits.h>#include "myformat.h"#include "LCD_Library.h"#define NMEA_TOKS_COMPARE   (1)#define NMEA_TOKS_PERCENT   (2)#define NMEA_TOKS_WIDTH     (3)#define NMEA_TOKS_TYPE      (4)/** * \brief Calculate control sum of binary buffer */int nmea_calc_crc(const char *buff, int buff_sz){    int chsum = 0,        it;    for(it = 0; it < buff_sz; ++it)        chsum ^= (int)buff[it];    return chsum;}/** * \brief Convert string to number */int nmea_atoi(const char *str, int str_sz, int radix){    char *tmp_ptr;    char buff[NMEA_CONVSTR_BUF];    int res = 0;    if(str_sz < NMEA_CONVSTR_BUF)    {        memcpy(&buff[0], str, str_sz);        buff[str_sz] = '\0';        res = strtol(&buff[0], &tmp_ptr, radix);    }    return res;}/** * \brief Convert string to fraction number */double nmea_atof(const char *str, int str_sz){    char *tmp_ptr;    char buff[NMEA_CONVSTR_BUF];    double res = 0;    if(str_sz < NMEA_CONVSTR_BUF)    {        memcpy(&buff[0], str, str_sz);        buff[str_sz] = '\0';        res = strtod(&buff[0], &tmp_ptr);    }    return res;}/** * \brief Formating string (like standart printf) with CRC tail (*CRC) */int nmea_printf(char *buff, int buff_sz, const char *format, ...){    int retval, add = 0;    va_list arg_ptr;    if(buff_sz <= 0)        return 0;    va_start(arg_ptr, format);    retval = NMEA_POSIX(LCD_mini_printf)(buff, buff_sz, format, arg_ptr);    retval += add;    if(retval < 0 || retval > buff_sz)    {        memset(buff, ' ', buff_sz);        retval = buff_sz;    }    va_end(arg_ptr);    return retval;}/** * \brief Analyse string (specificate for NMEA sentences) */int nmea_scanf(const char *buff, int buff_sz, const char *format, ...){    const char *beg_tok;    const char *end_buf = buff + buff_sz;    va_list arg_ptr;    int tok_type = NMEA_TOKS_COMPARE;    int width = 0;    const char *beg_fmt = 0;    int snum = 0, unum = 0;    int tok_count = 0;    void *parg_target;    va_start(arg_ptr, format);        for(; *format && buff < end_buf; ++format)    {        switch(tok_type)        {        case NMEA_TOKS_COMPARE:            if('%' == *format)                tok_type = NMEA_TOKS_PERCENT;            else if(*buff++ != *format)                goto fail;            break;        case NMEA_TOKS_PERCENT:            width = 0;            beg_fmt = format;            tok_type = NMEA_TOKS_WIDTH;        case NMEA_TOKS_WIDTH:            if(isdigit(*format))                break;            {                tok_type = NMEA_TOKS_TYPE;                if(format > beg_fmt)                    width = nmea_atoi(beg_fmt, (int)(format - beg_fmt), 10);            }        case NMEA_TOKS_TYPE:            beg_tok = buff;            if(!width && ('c' == *format || 'C' == *format) && *buff != format[1])                width = 1;            if(width)            {                if(buff + width < end_buf)                    buff += width;                else                    goto fail;            }            else            {                if(!format[1] || ((buff = (char *)memchr(buff, format[1], end_buf - buff)) ==0 ))                    buff = end_buf - 1;            }            if(buff >= end_buf)                goto fail;            tok_type = NMEA_TOKS_COMPARE;            tok_count++;            parg_target = 0; width = (int)(buff - beg_tok);            switch(*format)            {            case 'c':            case 'C':                parg_target = (void *)va_arg(arg_ptr, char *);                if(width && (parg_target) != 0)                    *((char *)parg_target) = *beg_tok;                break;            case 's':            case 'S':                parg_target = (void *)va_arg(arg_ptr, char *);                if(width && (parg_target)!=0)                {                    memcpy(parg_target, beg_tok, width);                    ((char *)parg_target)[width] = '\0';                }                break;            case 'f':            case 'g':            case 'G':            case 'e':            case 'E':                parg_target = (void *)va_arg(arg_ptr, double *);                if(width && (parg_target)!= 0 )                    *((double *)parg_target) = nmea_atof(beg_tok, width);                break;            };            if(parg_target)                break;            if((parg_target = (void *)va_arg(arg_ptr, int *)) == 0)                break;            if(!width)                break;            switch(*format)            {            case 'd':            case 'i':                snum = nmea_atoi(beg_tok, width, 10);                memcpy(parg_target, &snum, sizeof(int));                break;            case 'u':                unum = nmea_atoi(beg_tok, width, 10);                memcpy(parg_target, &unum, sizeof(unsigned int));                break;            case 'x':            case 'X':                unum = nmea_atoi(beg_tok, width, 16);                memcpy(parg_target, &unum, sizeof(unsigned int));                break;            case 'o':                unum = nmea_atoi(beg_tok, width, 8);                memcpy(parg_target, &unum, sizeof(unsigned int));                break;            default: goto fail;                            };            break;        };    }fail:    va_end(arg_ptr);    return tok_count;}

⌨️ 快捷键说明

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