DNSServiceErrorType DNSSD_API DNSServiceConstructFullName ( char *const fullName, const char *const service, // May be NULL const char *const regtype, const char *const domain ) { const int len = !regtype ? 0 : mDNSPlatformStrLen(regtype) - DomainEndsInDot(regtype); char *fn = fullName; char *const lim = fullName + 1005; const char *s = service; const char *r = regtype; const char *d = domain; // regtype must be at least "x._udp" or "x._tcp" if (len < 6 || !domain || !domain[0]) return kDNSServiceErr_BadParam; if (!strCaseEqual((regtype + len - 4), "_tcp", 4) && !strCaseEqual((regtype + len - 4), "_udp", 4)) return kDNSServiceErr_BadParam; if (service && *service) { while (*s) { unsigned char c = *s++; // Needs to be unsigned, or values like 0xFF will be interpreted as < 32 if (c <= ' ') // Escape non-printable characters { if (fn+4 >= lim) goto fail; *fn++ = '\\'; *fn++ = '0' + (c / 100); *fn++ = '0' + (c / 10) % 10; c = '0' + (c ) % 10; } else if (c == '.' || (c == '\\')) // Escape dot and backslash literals { if (fn+2 >= lim) goto fail; *fn++ = '\\'; } else if (fn+1 >= lim) goto fail; *fn++ = (char)c; } *fn++ = '.'; } while (*r) if (fn+1 >= lim) goto fail; else *fn++ = *r++; if (!DomainEndsInDot(regtype)) { if (fn+1 >= lim) goto fail; else *fn++ = '.'; } while (*d) if (fn+1 >= lim) goto fail; else *fn++ = *d++; if (!DomainEndsInDot(domain)) { if (fn+1 >= lim) goto fail; else *fn++ = '.'; } *fn = '\0'; return kDNSServiceErr_NoError; fail: *fn = '\0'; return kDNSServiceErr_BadParam; }
Seqspec seqspec_parseLine (char *line) { /** Parses line into a sequence segment; @param[in] line - something that can be parsed into a Seqspec object @return NULL if line could not be parsed, else pointer to a Seqspec object. This object is read-only to its users */ static Seqspec seqspec = NULL; char *cp; char *value; int t; char c; int blankSkip; int strandSeen = 0; static Stringa s = NULL; if (seqspec == NULL) seqspec = seqspec_create (); stringCreateClear(s,30); // remove leading blanks and blanks after ':' blankSkip = 1; cp = line - 1; while ((c = *++cp) != '\0') { if (isspace (c)) { if (blankSkip) continue; } else if (c == ':') blankSkip = 1; else blankSkip = 0; stringCatChar (s,c); } wordSet (string (s)," \t"); if ((cp = wordGet ()) == NULL) return NULL; if (!seqspec_IDset (seqspec,cp)) return NULL; seqspec->begin = 1; seqspec->end = SEQSPEC_END; seqspec->revcompF = 0; // loop over remaining words of line while ((cp = wordGet ()) != NULL) { if (!(value = dbseqDissect (cp))) continue; if (strCaseEqual (cp,"begin")) seqspec->begin = atoi (value); if (strCaseEqual (cp,"end")) seqspec->end = atoi (value); if (strCaseEqual (cp,"strand")) seqspec->revcompF = (*value == '-'); } if (seqspec->begin <= 0) return NULL; if (seqspec->end != SEQSPEC_END) { // treat e.g. begin:30 end:20 as revcomp if (seqspec->end < seqspec->begin) { if (strandSeen) { warn ("seqspec: bad segment syntax at %s",seqspec->dbseqname); return NULL; } t = seqspec->end; seqspec->end = seqspec->begin; seqspec->begin = t; seqspec->revcompF = 1; } } return seqspec; }
int myStrCaseEqual(char* a, char* b) { return strCaseEqual(a, b); }