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

📄 rfc822.c

📁 mutt-1.5.12 源代码。linux 下邮件接受的工具。
💻 C
📖 第 1 页 / 共 2 页
字号:
      s++;      begin = s;      SKIPWS (begin);    }    else if (*s == ';')    {      if (phraselen)      {	terminate_buffer (phrase, phraselen);	add_addrspec (&top, &last, phrase, comment, &commentlen, sizeof (comment) - 1);      }      else if (commentlen && last && !last->personal)      {	terminate_buffer (comment, commentlen);	last->personal = safe_strdup (comment);      }#ifdef EXACT_ADDRESS      if (last && !last->val)	last->val = mutt_substrdup (begin, s);#endif      /* add group terminator */      cur = rfc822_new_address ();      if (last)      {	last->next = cur;	last = cur;      }      phraselen = 0;      commentlen = 0;      s++;      begin = s;      SKIPWS (begin);    }    else if (*s == '<')    {      terminate_buffer (phrase, phraselen);      cur = rfc822_new_address ();      if (phraselen)      {	if (cur->personal)	  FREE (&cur->personal);	/* if we get something like "Michael R. Elkins" remove the quotes */	rfc822_dequote_comment (phrase);	cur->personal = safe_strdup (phrase);      }      if ((ps = parse_route_addr (s + 1, comment, &commentlen, sizeof (comment) - 1, cur)) == NULL)      {	rfc822_free_address (&top);	rfc822_free_address (&cur);	return NULL;      }      if (last)	last->next = cur;      else	top = cur;      last = cur;      phraselen = 0;      commentlen = 0;      s = ps;    }    else    {      if (phraselen && phraselen < sizeof (phrase) - 1 && ws_pending)	phrase[phraselen++] = ' ';      if ((ps = next_token (s, phrase, &phraselen, sizeof (phrase) - 1)) == NULL)      {	rfc822_free_address (&top);	return NULL;      }      s = ps;    }    ws_pending = isspace ((unsigned char) *s);    SKIPWS (s);  }    if (phraselen)  {    terminate_buffer (phrase, phraselen);    terminate_buffer (comment, commentlen);    add_addrspec (&top, &last, phrase, comment, &commentlen, sizeof (comment) - 1);  }  else if (commentlen && last && !last->personal)  {    terminate_buffer (comment, commentlen);    last->personal = safe_strdup (comment);  }#ifdef EXACT_ADDRESS  if (last)    last->val = mutt_substrdup (begin, s);#endif  return top;}void rfc822_qualify (ADDRESS *addr, const char *host){  char *p;  for (; addr; addr = addr->next)    if (!addr->group && addr->mailbox && strchr (addr->mailbox, '@') == NULL)    {      p = safe_malloc (mutt_strlen (addr->mailbox) + mutt_strlen (host) + 2);      sprintf (p, "%s@%s", addr->mailbox, host);	/* __SPRINTF_CHECKED__ */      FREE (&addr->mailbox);      addr->mailbox = p;    }}voidrfc822_cat (char *buf, size_t buflen, const char *value, const char *specials){  if (strpbrk (value, specials))  {    char tmp[256], *pc = tmp;    size_t tmplen = sizeof (tmp) - 3;    *pc++ = '"';    for (; *value && tmplen > 1; value++)    {      if (*value == '\\' || *value == '"')      {	*pc++ = '\\';	tmplen--;      }      *pc++ = *value;      tmplen--;    }    *pc++ = '"';    *pc = 0;    strfcpy (buf, tmp, buflen);  }  else    strfcpy (buf, value, buflen);}void rfc822_write_address_single (char *buf, size_t buflen, ADDRESS *addr,				  int display){  size_t len;  char *pbuf = buf;  char *pc;    if (!addr)    return;  buflen--; /* save room for the terminal nul */#ifdef EXACT_ADDRESS  if (addr->val)  {    if (!buflen)      goto done;    strfcpy (pbuf, addr->val, buflen);    len = mutt_strlen (pbuf);    pbuf += len;    buflen -= len;    if (addr->group)    {      if (!buflen)	goto done;      *pbuf++ = ':';      buflen--;      *pbuf = 0;    }    return;  }#endif  if (addr->personal)  {    if (strpbrk (addr->personal, RFC822Specials))    {      if (!buflen)	goto done;      *pbuf++ = '"';      buflen--;      for (pc = addr->personal; *pc && buflen > 0; pc++)      {	if (*pc == '"' || *pc == '\\')	{	  if (!buflen)	    goto done;	  *pbuf++ = '\\';	  buflen--;	}	if (!buflen)	  goto done;	*pbuf++ = *pc;	buflen--;      }      if (!buflen)	goto done;      *pbuf++ = '"';      buflen--;    }    else    {      if (!buflen)	goto done;      strfcpy (pbuf, addr->personal, buflen);      len = mutt_strlen (pbuf);      pbuf += len;      buflen -= len;    }    if (!buflen)      goto done;    *pbuf++ = ' ';    buflen--;  }  if (addr->personal || (addr->mailbox && *addr->mailbox == '@'))  {    if (!buflen)      goto done;    *pbuf++ = '<';    buflen--;  }  if (addr->mailbox)  {    if (!buflen)      goto done;    if (ascii_strcmp (addr->mailbox, "@") && !display)    {      strfcpy (pbuf, addr->mailbox, buflen);      len = mutt_strlen (pbuf);    }    else if (ascii_strcmp (addr->mailbox, "@") && display)    {      strfcpy (pbuf, mutt_addr_for_display (addr), buflen);      len = mutt_strlen (pbuf);    }    else    {      *pbuf = '\0';      len = 0;    }    pbuf += len;    buflen -= len;    if (addr->personal || (addr->mailbox && *addr->mailbox == '@'))    {      if (!buflen)	goto done;      *pbuf++ = '>';      buflen--;    }    if (addr->group)    {      if (!buflen)	goto done;      *pbuf++ = ':';      buflen--;      if (!buflen)	goto done;      *pbuf++ = ' ';      buflen--;    }  }  else  {    if (!buflen)      goto done;    *pbuf++ = ';';    buflen--;  }done:  /* no need to check for length here since we already save space at the     beginning of this routine */  *pbuf = 0;}/* note: it is assumed that `buf' is nul terminated! */void rfc822_write_address (char *buf, size_t buflen, ADDRESS *addr, int display){  char *pbuf = buf;  size_t len = mutt_strlen (buf);    buflen--; /* save room for the terminal nul */  if (len > 0)  {    if (len > buflen)      return; /* safety check for bogus arguments */    pbuf += len;    buflen -= len;    if (!buflen)      goto done;    *pbuf++ = ',';    buflen--;    if (!buflen)      goto done;    *pbuf++ = ' ';    buflen--;  }  for (; addr && buflen > 0; addr = addr->next)  {    /* use buflen+1 here because we already saved space for the trailing       nul char, and the subroutine can make use of it */    rfc822_write_address_single (pbuf, buflen + 1, addr, display);    /* this should be safe since we always have at least 1 char passed into       the above call, which means `pbuf' should always be nul terminated */    len = mutt_strlen (pbuf);    pbuf += len;    buflen -= len;    /* if there is another address, and its not a group mailbox name or       group terminator, add a comma to separate the addresses */    if (addr->next && addr->next->mailbox && !addr->group)    {      if (!buflen)	goto done;      *pbuf++ = ',';      buflen--;      if (!buflen)	goto done;      *pbuf++ = ' ';      buflen--;    }  }done:  *pbuf = 0;}/* this should be rfc822_cpy_adr */ADDRESS *rfc822_cpy_adr_real (ADDRESS *addr){  ADDRESS *p = rfc822_new_address ();#ifdef EXACT_ADDRESS  p->val = safe_strdup (addr->val);#endif  p->personal = safe_strdup (addr->personal);  p->mailbox = safe_strdup (addr->mailbox);  p->group = addr->group;  return p;}/* this should be rfc822_cpy_adrlist */ADDRESS *rfc822_cpy_adr (ADDRESS *addr){  ADDRESS *top = NULL, *last = NULL;    for (; addr; addr = addr->next)  {    if (last)    {      last->next = rfc822_cpy_adr_real (addr);      last = last->next;    }    else      top = last = rfc822_cpy_adr_real (addr);  }  return top;}/* append list 'b' to list 'a' and return the last element in the new list */ADDRESS *rfc822_append (ADDRESS **a, ADDRESS *b){  ADDRESS *tmp = *a;  while (tmp && tmp->next)    tmp = tmp->next;  if (!b)    return tmp;  if (tmp)    tmp->next = rfc822_cpy_adr (b);  else    tmp = *a = rfc822_cpy_adr (b);  while (tmp && tmp->next)    tmp = tmp->next;  return tmp;}#ifdef TESTINGint safe_free (void **p)	/* __SAFE_FREE_CHECKED__ */{  free(*p);		/* __MEM_CHECKED__ */  *p = 0;}int main (int argc, char **argv){  ADDRESS *list;  char buf[256];# if 0  char *str = "michael, Michael Elkins <me@mutt.org>, testing a really complex address: this example <@contains.a.source.route,@with.multiple.hosts:address@example.com>;, lothar@of.the.hillpeople (lothar)";# else  char *str = "a b c ";# endif    list = rfc822_parse_adrlist (NULL, str);  buf[0] = 0;  rfc822_write_address (buf, sizeof (buf), list);  rfc822_free_address (&list);  puts (buf);  exit (0);}#endif

⌨️ 快捷键说明

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