예제 #1
0
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;
    }
예제 #2
0
파일: seqspeclist.c 프로젝트: Accio/ribios
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;
}
예제 #3
0
파일: cgi.c 프로젝트: Accio/ribios
int myStrCaseEqual(char* a, char* b) {
  return strCaseEqual(a, b);
}