📄 parse.c
字号:
SETRTC(CVT_FAIL|CVT_BADTIME); return -1; /* bad min */ } t = TIMES60(t) + clock_time->minute; /* sec */ if (clock_time->second < 0 || clock_time->second > 60) /* allow for LEAPs */ { SETRTC(CVT_FAIL|CVT_BADTIME); return -1; /* bad sec */ } t = TIMES60(t) + clock_time->second; t += clock_time->utcoffset; /* warp to UTC */ /* done */ clock_time->utctime = t; /* documentray only */ return t;}/*--------------- format conversion -----------------------------------*/intStoi( const unsigned char *s, long *zp, int cnt ){ char unsigned const *b = s; int f,z,v; char unsigned c; f=z=v=0; while(*s == ' ') s++; if (*s == '-') { s++; v = 1; } else if (*s == '+') s++; for(;;) { c = *s++; if (c == '\0' || c < '0' || c > '9' || (cnt && ((s-b) > cnt))) { if (f == 0) { return(-1); } if (v) z = -z; *zp = z; return(0); } z = (z << 3) + (z << 1) + ( c - '0' ); f=1; }}intStrok( const unsigned char *s, const unsigned char *m ){ if (!s || !m) return 0; while(*s && *m) { if ((*m == ' ') ? 1 : (*s == *m)) { s++; m++; } else { return 0; } } return !*m;}u_longupdatetimeinfo( register parse_t *parseio, register u_long flags ){#ifdef PARSEKERNEL { int s = splhigh();#endif parseio->parse_lstate = parseio->parse_dtime.parse_state | flags | PARSEB_TIMECODE; parseio->parse_dtime.parse_state = parseio->parse_lstate;#ifdef PARSEKERNEL (void)splx((unsigned int)s); }#endif #ifdef PARSEKERNEL parseprintf(DD_PARSE, ("updatetimeinfo status=0x%x, time=%x\n", parseio->parse_dtime.parse_state, parseio->parse_dtime.parse_time.tv.tv_sec));#else parseprintf(DD_PARSE, ("updatetimeinfo status=0x%lx, time=%x\n", (long)parseio->parse_dtime.parse_state, parseio->parse_dtime.parse_time.fp.l_ui));#endif return CVT_OK; /* everything fine and dandy... */}/* * syn_simple * * handle a sync time stamp *//*ARGSUSED*/voidsyn_simple( register parse_t *parseio, register timestamp_t *ts, register struct format *format, register u_long why ){ parseio->parse_dtime.parse_stime = *ts;}/* * pps_simple * * handle a pps time stamp *//*ARGSUSED*/u_longpps_simple( register parse_t *parseio, register int status, register timestamp_t *ptime ){ parseio->parse_dtime.parse_ptime = *ptime; parseio->parse_dtime.parse_state |= PARSEB_PPS|PARSEB_S_PPS; return CVT_NONE;}/* * pps_one * * handle a pps time stamp in ONE edge *//*ARGSUSED*/u_longpps_one( register parse_t *parseio, register int status, register timestamp_t *ptime ){ if (status) return pps_simple(parseio, status, ptime); return CVT_NONE;}/* * pps_zero * * handle a pps time stamp in ZERO edge *//*ARGSUSED*/u_longpps_zero( register parse_t *parseio, register int status, register timestamp_t *ptime ){ if (!status) return pps_simple(parseio, status, ptime); return CVT_NONE;}/* * timepacket * * process a data packet */static u_longtimepacket( register parse_t *parseio ){ register unsigned short format; register time_t t; u_long cvtrtc; /* current conversion result */ clocktime_t clock_time; memset((char *)&clock_time, 0, sizeof clock_time); format = parseio->parse_lformat; if (format == (unsigned short)~0) return CVT_NONE; switch ((cvtrtc = clockformats[format]->convert ? clockformats[format]->convert((unsigned char *)parseio->parse_ldata, parseio->parse_ldsize, (struct format *)(clockformats[format]->data), &clock_time, parseio->parse_pdata) : CVT_NONE) & CVT_MASK) { case CVT_FAIL: parseio->parse_badformat++; break; case CVT_NONE: /* * too bad - pretend bad format */ parseio->parse_badformat++; break; case CVT_OK: break; case CVT_SKIP: return CVT_NONE; default: /* shouldn't happen */#ifndef PARSEKERNEL msyslog(LOG_WARNING, "parse: INTERNAL error: bad return code of convert routine \"%s\"\n", clockformats[format]->name);#endif return CVT_FAIL|cvtrtc; } if ((t = parse_to_unixtime(&clock_time, &cvtrtc)) == -1) { return CVT_FAIL|cvtrtc; } /* * time stamp */#ifdef PARSEKERNEL parseio->parse_dtime.parse_time.tv.tv_sec = t; parseio->parse_dtime.parse_time.tv.tv_usec = clock_time.usecond;#else parseio->parse_dtime.parse_time.fp.l_ui = t + JAN_1970; TVUTOTSF(clock_time.usecond, parseio->parse_dtime.parse_time.fp.l_uf);#endif parseio->parse_dtime.parse_format = format; return updatetimeinfo(parseio, clock_time.flags);}/*ARGSUSED*/intparse_timecode( parsectl_t *dct, parse_t *parse ){ dct->parsegettc.parse_state = parse->parse_lstate; dct->parsegettc.parse_format = parse->parse_lformat; /* * move out current bad packet count * user program is expected to sum these up * this is not a problem, as "parse" module are * exclusive open only */ dct->parsegettc.parse_badformat = parse->parse_badformat; parse->parse_badformat = 0; if (parse->parse_ldsize <= PARSE_TCMAX) { dct->parsegettc.parse_count = parse->parse_ldsize; memcpy(dct->parsegettc.parse_buffer, parse->parse_ldata, dct->parsegettc.parse_count); return 1; } else { return 0; }} /*ARGSUSED*/intparse_setfmt( parsectl_t *dct, parse_t *parse ){ if (dct->parseformat.parse_count <= PARSE_TCMAX) { if (dct->parseformat.parse_count) { register unsigned short i; for (i = 0; i < nformats; i++) { if (!Strcmp(dct->parseformat.parse_buffer, clockformats[i]->name)) { if (parse->parse_pdata) FREE(parse->parse_pdata, parse->parse_plen); parse->parse_pdata = 0; parse->parse_plen = clockformats[i]->plen; if (parse->parse_plen) { parse->parse_pdata = MALLOC(parse->parse_plen); if (!parse->parse_pdata) { parseprintf(DD_PARSE, ("set format failed: malloc for private data area failed\n")); return 0; } memset((char *)parse->parse_pdata, 0, parse->parse_plen); } if (parse->parse_data) FREE(parse->parse_data, (unsigned)(parse->parse_dsize * 2 + 2)); parse->parse_ldata = parse->parse_data = 0; parse->parse_dsize = clockformats[i]->length; if (parse->parse_dsize) { parse->parse_data = (char*)MALLOC((unsigned)(parse->parse_dsize * 2 + 2)); if (!parse->parse_data) { if (parse->parse_pdata) FREE(parse->parse_pdata, parse->parse_plen); parse->parse_pdata = 0; parseprintf(DD_PARSE, ("init failed: malloc for data area failed\n")); return 0; } } /* * leave room for '\0' */ parse->parse_ldata = parse->parse_data + parse->parse_dsize + 1; parse->parse_lformat = i; return 1; } } } } return 0;}/*ARGSUSED*/intparse_getfmt( parsectl_t *dct, parse_t *parse ){ if (dct->parseformat.parse_format < nformats && Strlen(clockformats[dct->parseformat.parse_format]->name) <= PARSE_TCMAX) { dct->parseformat.parse_count = Strlen(clockformats[dct->parseformat.parse_format]->name)+1; memcpy(dct->parseformat.parse_buffer, clockformats[dct->parseformat.parse_format]->name, dct->parseformat.parse_count); return 1; } else { return 0; }}/*ARGSUSED*/intparse_setcs( parsectl_t *dct, parse_t *parse ){ parse->parse_ioflags &= ~PARSE_IO_CSIZE; parse->parse_ioflags |= dct->parsesetcs.parse_cs & PARSE_IO_CSIZE; return 1;}#else /* not (REFCLOCK && CLOCK_PARSE) */int parse_bs;#endif /* not (REFCLOCK && CLOCK_PARSE) *//* * History: * * parse.c,v * Revision 4.20 2005/08/06 17:39:40 kardel * cleanup size handling wrt/ to buffer boundaries * * Revision 4.19 2005/04/16 17:32:10 kardel * update copyright * * Revision 4.18 2004/11/14 16:11:05 kardel * update Id tags * * Revision 4.17 2004/11/14 15:29:41 kardel * support PPSAPI, upgrade Copyright to Berkeley style * * Revision 4.14 1999/11/28 09:13:52 kardel * RECON_4_0_98F * * Revision 4.13 1999/02/28 11:50:20 kardel * (timepacket): removed unecessary code * * Revision 4.12 1999/02/21 12:17:44 kardel * 4.91f reconcilation * * Revision 4.11 1999/02/21 11:09:47 kardel * unified debug output * * Revision 4.10 1998/12/20 23:45:30 kardel * fix types and warnings * * Revision 4.9 1998/08/09 22:26:06 kardel * Trimble TSIP support * * Revision 4.8 1998/06/14 21:09:39 kardel * Sun acc cleanup * * Revision 4.7 1998/06/13 15:19:13 kardel * fix mem*() to b*() function macro emulation * * Revision 4.6 1998/06/13 13:24:13 kardel * printf fmt * * Revision 4.5 1998/06/13 13:01:10 kardel * printf fmt * * Revision 4.4 1998/06/13 12:12:10 kardel * bcopy/memcpy cleanup * fix SVSV name clash * * Revision 4.3 1998/06/12 15:22:30 kardel * fix prototypes * * Revision 4.2 1998/06/12 09:13:27 kardel * conditional compile macros fixed * printf prototype * * Revision 4.1 1998/05/24 09:39:55 kardel * implementation of the new IO handling model * * Revision 4.0 1998/04/10 19:45:36 kardel * Start 4.0 release version numbering * * from V3 3.46 log info deleted 1998/04/11 kardel */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -