Ejemplo n.º 1
0
/****************************************************
* 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;
}
Ejemplo n.º 2
0
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);
					}
				}
			}
		}

}