/* * DIS/x : An implementation of the IEEE 1278.1 protocol * * Copyright (C) 1996-1998, Riley Rainey (rrainey@ix.netcom.com) * * This library is free software; you can redistribute it and/or * modify it under the terms of either: * * a) the GNU Library General Public License as published by the Free * Software Foundation; either version 2 of the License, or (at your * option) any later version. A description of the terms and conditions * of the GLPL may be found in the "COPYING.LIB" file. * * b) the "Artistic License" which comes with this Kit. Information * about this license may be found in the "Artistic" file. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License or the Artistic License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the Free * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * Information describing how to contact the author can be found in the * README file. */ #include #include #include #define DMAX 16 /* maximum number of delimiter chars */ #define BMAX 64 /* maximum incoming string length */ /* * Generate a DIS entity ID from a string * * C-style hexidecimal numbers may be used in the input stream: * * 1/1/0xfffe, and 0xff/0xff/0x1 are both valid * * Example invalid strings: * * 1/1/1,000 Entity ID field contains an invalid character * 1/1/1000000 Entity ID field > 0xffff * * Return values: * * 0 success * 1 parse error * 2 incoming string buffer too large; (max is 64 characters) * 3 one or more of the fields contains an invalid value (<0 or >0xffff) * 4 invalid character in string */ int DISParseEntityID (dis_entity_id *p, const char * buf, int bufsize, const char *delim) { char pdelim[DMAX+1]; char tbuf[BMAX+1]; char *cur, *next, *endptr; long rval; int result = 1; memset ( p, 0, sizeof(dis_entity_id)); /* * Buffer too large? */ if (bufsize > BMAX ) { return 2; } strncpy ( tbuf, buf, BMAX ); tbuf[BMAX] = '\0'; if (delim) { strncpy(pdelim, delim, DMAX); pdelim[DMAX] = '\0'; } else { strcpy( pdelim, ":./" ); } cur = tbuf; next = strpbrk ( cur, pdelim ); if ( next != NULL ) { /* * Once we get a delimiter, all other delimeters must match */ pdelim[0] = *next; pdelim[1] = '\0'; /* * Get Site ID */ endptr = next; rval = strtol ( cur, &endptr, 0 ); if (rval < 0 || rval > 0xffff) { return 3; } else { p->sim_id.site_id = (unsigned short) rval; } /* * Ensure strtol stopped parsing at the correct spot */ if ( endptr != next ) { return 4; } cur = next+1; next = strpbrk ( cur, pdelim ); if ( next != NULL ) { /* * Get application ID */ endptr = next; rval = strtol ( cur, &endptr, 0 ); if (rval < 0 || rval > 0xffff) { return 3; } else { p->sim_id.application_id = (unsigned short) rval; } /* * Ensure strtol stopped parsing at the correct spot */ if ( endptr != next ) { return 4; } /* * Get Entity ID */ cur = next+1; rval = strtol ( cur, NULL, 0 ); if (rval < 0 || rval > 0xffff) { return 3; } else { p->entity_id = (unsigned short) rval; } result = 0; } } return result; }