/**************************************************** * Parse a string for the ranges ****************************************************/ int AddRangesString(NumList* n, char* RawRanges, NumAlias* Aliases, int NumAliases){ int i; char ThisNum[64]; int ThisNumCount; unsigned int LowNum; unsigned int HighNum; int IsRange; char* Ranges; DEBUGPATH; if (!n) return FALSE; Ranges=calloc(strlen(RawRanges)*2,sizeof(char)); if (!ReplaceAliases(RawRanges, strlen(RawRanges), Ranges, strlen(RawRanges)*2, Aliases, NumAliases)){ printf("Couldn't apply alias list\n"); free(Ranges); return FALSE; } ThisNumCount=0; IsRange=FALSE; for (i=0;i<strlen(Ranges);i++){ switch(Ranges[i]){ case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': case '0': /*normal number, keep going*/ ThisNum[ThisNumCount]=Ranges[i]; ThisNumCount++; break; case ',': /*this a delimiter, add the numbers*/ ThisNum[ThisNumCount]=0x00; if (!IsRange){ LowNum=strtoul(ThisNum,NULL,10); AddRange(n, LowNum, LowNum); #ifdef DEBUG printf("2Added Number %u-%u\n",LowNum, LowNum); #endif }else{ HighNum=strtoul(ThisNum, NULL, 10); AddRange(n, LowNum, HighNum); #ifdef DEBUG printf("Added Range %u-%u\n",LowNum, HighNum); #endif } ThisNumCount=0; IsRange=FALSE; break; case ' ': /*ignore white space*/ break; case '-': /*this is a range*/ ThisNum[ThisNumCount]=0x00; LowNum=strtoul(ThisNum, NULL, 10); #ifdef DEBUG printf("Low part of the range is %u\n",LowNum); #endif IsRange=TRUE; ThisNumCount=0; break; default: printf("Invalid character \"%c\"\n", Ranges[i]); printf("I don't understand %s\n",Ranges); free(Ranges); return FALSE; } } /*Finish out the last one*/ ThisNum[ThisNumCount]=0x00; if (!IsRange){ LowNum=strtoul(ThisNum,NULL,10); AddRange(n, LowNum, LowNum); #ifdef DEBUG printf("3Added Number %u-%u\n",LowNum, LowNum); #endif }else{ HighNum=strtoul(ThisNum, NULL, 10); AddRange(n, LowNum, HighNum); #ifdef DEBUG printf("Added Range %u-%u\n",LowNum, HighNum); #endif } free(Ranges); return TRUE; }
void SMTPMessage::HandleAddresses() { JPtrArray<JString> names(JPtrArrayT::kForgetAll); GParseNameList(*itsTo, names); ReplaceAliases(names); while (!names.IsEmpty()) { JString* str = names.GetFirstElement(); if (!str->BeginsWith("<")) { str->Prepend("<"); str->Append(">"); } if (itsToNames->InsertSorted(str,kJFalse)) { names.RemoveElement(1); } else { names.DeleteElement(1); } } GParseNameList(*itsCC, names); ReplaceAliases(names); while (!names.IsEmpty()) { JString* str = names.GetFirstElement(); if (!str->BeginsWith("<")) { str->Prepend("<"); str->Append(">"); } JIndex findex; if (itsToNames->SearchSorted(str, JOrderedSetT::kFirstMatch, &findex)) { names.DeleteElement(1); } else { if (itsCcNames->InsertSorted(str,kJFalse)) { names.RemoveElement(1); } else { names.DeleteElement(1); } } } GParseNameList(*itsBCC, names); ReplaceAliases(names); while (!names.IsEmpty()) { JString* str = names.GetFirstElement(); if (!str->BeginsWith("<")) { str->Prepend("<"); str->Append(">"); } JIndex findex; if (itsToNames->SearchSorted(str, JOrderedSetT::kFirstMatch, &findex)) { names.DeleteElement(1); } else { if (itsCcNames->SearchSorted(str, JOrderedSetT::kFirstMatch, &findex)) { names.DeleteElement(1); } else { if (itsBccNames->InsertSorted(str,kJFalse)) { names.RemoveElement(1); } else { names.DeleteElement(1); } } } } }