Beispiel #1
0
void ExtractAddressFromLine(char *finder,char **storeto,char **storetonick)
{
	if(finder==NULL)
	{
		*storeto=*storetonick=NULL;
		return;
	}
	while(WS(finder)) finder++;
	if((*finder)!='<')
	{
		char *finderend=finder+1;
		do
		{
			if(ENDLINEWS(finderend))						//after endline information continues
				finderend+=2;
			while(!ENDLINE(finderend) && !EOS(finderend)) finderend++;		//seek to the end of line or to the end of string
		}while(ENDLINEWS(finderend));
		finderend--;
		while(WS(finderend) || ENDLINE(finderend)) finderend--;				//find the end of text, no whitespace
		if(*finderend!='>')						//not '>' at the end of line
			CopyToHeader(finder,finderend+1,storeto,MIME_MAIL);
		else								//at the end of line, there's '>'
		{
			char *finder2=finderend;
			while((*finder2!='<') && (finder2>finder)) finder2--;		//go to matching '<' or to the start
			CopyToHeader(finder2,finderend+1,storeto,MIME_MAIL);
			if(*finder2=='<')						//if we found '<', the rest copy as from nick
			{
				finder2--;
				while(WS(finder2) || ENDLINE(finder2)) finder2--;		//parse whitespace
				CopyToHeader(finder,finder2+1,storetonick,MIME_MAIL);		//and store nickname
			}
		}
	}
	else
	{
		char *finderend=finder+1;
		do
		{
			if(ENDLINEWS(finderend))							//after endline information continues
				finderend+=2;
			while(!ENDLINE(finderend) && (*finderend!='>') && !EOS(finderend)) finderend++;		//seek to the matching < or to the end of line or to the end of string
		}while(ENDLINEWS(finderend));
		CopyToHeader(finder,finderend+1,storeto,MIME_MAIL);				//go to first '>' or to the end and copy
		finder=finderend+1;
		while(WS(finder)) finder++;								//parse whitespace
		if(!ENDLINE(finder) && !EOS(finder))					//if there are chars yet, it's nick
		{
			finderend=finder+1;
			while(!ENDLINE(finderend) && !EOS(finderend)) finderend++;	//seek to the end of line or to the end of string
			finderend--;
			while(WS(finderend)) finderend--;				//find the end of line, no whitespace
			CopyToHeader(finder,finderend+1,storetonick,MIME_MAIL);
		}
	}
}
Beispiel #2
0
int Context::NotifyVideoEOS(StreamVideo* pSource)
{
    if (m_bEOSVideo)
        return 0;

#if 0
    odbgstream os;
    os << "mux::eosvideo" << endl;
#endif

    m_bEOSVideo = true;

    if (m_file.GetStream() == 0)
        __noop;
    else if ((m_pAudio == 0) || m_bEOSAudio)
    {
        for (;;)
        {
            if ((m_pVideo != 0) && !m_pVideo->GetFrames().empty())
                CreateNewCluster(0);
            else if ((m_pAudio != 0) && !m_pAudio->GetFrames().empty())
                CreateNewClusterAudioOnly();
            else
                break;
        }
    }

    return EOS(pSource);
}
      unsigned long Token::
      line () const 
      {
        if (*this == eos) throw EOS ();

        return line_;
      }
      Token::
      operator char () const
      {
        if (*this == eos) throw EOS ();

        return traits::to_char_type (c_);
      }
void OMXAudioPlayer::WaitCompletion()
{
    //ofLogVerbose(__func__) << "OMXAudioPlayer::WaitCompletion";
    if(!decoder)
    {
        return;
    }

    unsigned int nTimeOut = 2.0f * 1000;
    while(nTimeOut)
    {
        if(EOS())
        {
            ofLog(OF_LOG_VERBOSE, "%s::%s - got eos\n", "OMXAudioPlayer", __func__);
            break;
        }

        if(nTimeOut == 0)
        {
            ofLog(OF_LOG_ERROR, "%s::%s - wait for eos timed out\n", "OMXAudioPlayer", __func__);
            break;
        }
        omxClock->sleep(50);
        nTimeOut -= 50;
    }
}
Beispiel #6
0
void ExtractStringFromLine(char *finder,char **storeto)
{
	if(finder==NULL)
	{
		*storeto=NULL;
		return;
	}
	while(WS(finder)) finder++;
	char *finderend=finder;

	do
	{
		if(ENDLINEWS(finderend)) finderend++;						//after endline information continues
		while(!ENDLINE(finderend) && !EOS(finderend)) finderend++;
	}while(ENDLINEWS(finderend));
	finderend--;
	while(WS(finderend)) finderend--;				//find the end of line, no whitespace
	CopyToHeader(finder,finderend+1,storeto,MIME_PLAIN);
}
Beispiel #7
0
HRESULT CBufferFilterOutputPin::DeliverEndOfStream()
{
	CallQueue(EOS());
}
Beispiel #8
0
void WINAPI TranslateHeaderFcn(char *stream,int len,struct CMimeItem **head)
{
	try
	{
		char *finder=stream;
		char *prev1,*prev2,*prev3;
		struct CMimeItem *Item=NULL;

		while(finder<=(stream+len))
		{
			while(ENDLINEWS(finder)) finder++;

			//at the start of line
			if (DOTLINE(finder+1))					//at the end of stream
				break;

			prev1=finder;

			while(*finder != ':' && !EOS(finder)) finder++;
			if (!EOS(finder))
				prev2=finder++;
			else
				break;

			while(WS(finder) && !EOS(finder)) finder++;
			if (!EOS(finder))
				prev3=finder;
			else
				break;

			do
			{
				if (ENDLINEWS(finder)) finder+=2;						//after endline information continues
				while(!ENDLINE(finder) && !EOS(finder)) finder++;
			}while(ENDLINEWS(finder));

			if (Item != NULL)
			{
				if (NULL==(Item->Next=new struct CMimeItem))
					break;
				Item=Item->Next;
			}
			else
			{
				Item = new CMimeItem;
				*head = Item;
			}

			Item->Next=NULL;
			Item->name=new char [prev2-prev1+1];
			lstrcpynA(Item->name,prev1,prev2-prev1+1);
			Item->value=new char [finder-prev3+1];
			lstrcpynA(Item->value,prev3,finder-prev3+1);

			if (EOS(finder))
				break;
			finder++;
			if (ENDLINE(finder)) {
				finder++;
				if (ENDLINE(finder)) {
					// end of headers. message body begins
					finder++;
					if (ENDLINE(finder))finder++;
					prev1 = finder;
					while (!DOTLINE(finder+1))finder++;
					if (ENDLINE(finder))finder--;
					prev2 = finder;
					if (prev2>prev1) { // yes, we have body
						if (NULL==(Item->Next=new struct CMimeItem))	break; // Cant create new item?!
						Item=Item->Next;
						Item->Next=NULL;//just in case;
						Item->name=new char[5]; strncpy(Item->name,"Body",5);
						Item->value=new char [prev2-prev1];
						lstrcpynA(Item->value,prev1,prev2-prev1-1);
					}
					break; // there is nothing else
				}
			}
		}
	}
	catch(...)
	{
		MessageBoxA(NULL,"Translate header error","",0);
	}
}
Beispiel #9
0
	//==================================================================================
	int32 InPlaceParser::ProcessLine(int32 lineno,char *line,InPlaceParserInterface *callback)
	{
		int32 ret = 0;

		const char *argv[MAXARGS];
		int32 argc = 0;

		char *foo = line;

		while ( !EOS(*foo) && argc < MAXARGS )
		{
			foo = SkipSpaces(foo); // skip any leading spaces

			if ( EOS(*foo) ) 
				break;

			if ( *foo == mQuoteChar ) // if it is an open quote
			{
				++foo;
				if ( argc < MAXARGS )
				{
					argv[argc++] = foo;
				}
				while ( !EOS(*foo) && *foo != mQuoteChar ) 
					++foo;
				if ( !EOS(*foo) )
				{
					*foo = 0; // replace close quote with zero byte EOS
					++foo;
				}
			}
			else
			{
				foo = AddHard(argc,argv,foo); // add any hard separators, skip any spaces

				if ( IsNonSeparator(*foo) )  // add non-hard argument.
				{
					bool quote  = false;
					if ( *foo == mQuoteChar )
					{
						++foo;
						quote = true;
					}

					if ( argc < MAXARGS )
					{
						argv[argc++] = foo;
					}

					if ( quote )
					{
						while (*foo && *foo != mQuoteChar ) 
							++foo;
						if ( *foo ) 
							*foo = 32;
					}

					// continue..until we hit an eos ..
					while ( !EOS(*foo) ) // until we hit EOS
					{
						if ( IsWhiteSpace(*foo) ) // if we hit a space, stomp a zero byte, and exit
						{
							*foo = 0;
							++foo;
							break;
						}
						else if ( IsHard(*foo) ) // if we hit a hard separator, stomp a zero byte and store the hard separator argument
						{
							const char *hard = &mHardString[*foo*2];
							*foo = 0;
							if ( argc < MAXARGS )
							{
								argv[argc++] = hard;
							}
							++foo;
							break;
						}
						++foo;
					} // end of while loop...
				}
			}
		}

		if ( argc )
		{
			ret = callback->ParseLine(lineno, argc, argv );
		}

		return ret;
	}
Beispiel #10
0
	//==================================================================================
	char * InPlaceParser::SkipSpaces(char *foo)
	{
		while ( !EOS(*foo) && IsWhiteSpace(*foo) ) 
			++foo;
		return foo;
	}
Beispiel #11
0
String TextStreamReader::ReadLine()
{
    // TODO
    // Probably it is possible to group Stream::ReadString with this,
    // both use similar algorythm, difference is only in terminator chars

    if (!_stream)
    {
        return "";
    }

    String str;
    int chars_read_last = 0;
    int line_break_position = -1;
    // Read a chunk of memory to buffer and seek for null-terminator,
    // if not found, repeat until EOS
    const int single_chunk_length = 3000;
    const int max_chars = 5000000;
    char char_buffer[single_chunk_length + 1];
    do
    {
        chars_read_last = _stream->Read(char_buffer, single_chunk_length);
        char *seek_ptr = char_buffer;
        int c;
        for (c = 0; c < chars_read_last && *seek_ptr != '\n'; ++c, ++seek_ptr);

        int append_length = 0;
        int str_len = str.GetLength();
        if (c < chars_read_last && *seek_ptr == '\n')
        {
            line_break_position = seek_ptr - char_buffer;
            if (str_len < max_chars)
            {
                append_length = Math::Min(line_break_position, max_chars - str_len);
            }
        }
        else
        {
            append_length = Math::Min(chars_read_last, max_chars - str_len);
        }

        if (append_length > 0)
        {
            char_buffer[append_length] = '\0';
            str.Append(char_buffer);
        }
    }
    while (!EOS() && line_break_position < 0);

    // If null-terminator was found make sure stream is positioned at the next
    // byte after line end
    if (line_break_position >= 0)
    {
        // CHECKME: what if stream does not support seek? need an algorythm fork for that
        // the seek offset should be negative
        _stream->Seek(kSeekCurrent, line_break_position - chars_read_last + 1 /* beyond line feed */);
    }

    str.TrimRight('\r'); // skip carriage-return, if any
    return str;
}
Beispiel #12
0
int solve_sudoku(char** sudoku) {
    // create a copy of the original sudoku - replace 'x' with '0'
    char** copy = allocate_sudoku();
    copy_sudoku(sudoku, copy);
    for (int i = 0; i < 9; ++i)
        for (int j = 0; j < 9; ++j)
            if (copy[i][j] == 'x')
                copy[i][j] = '0';


    unsigned int nx = 0;
    unsigned int ny = 0;

    unsigned int state = sudoku[nx][ny] == EMPTY_SQUARE ? STATE_SOLVE : STATE_STEP_FORWARD;

    while (1) {
        switch (state) {
            case STATE_SOLVE:
                if (copy[nx][ny] == '9') {
                    // reset current square and go back
                    copy[nx][ny] = '0';
                    state = STATE_STEP_BACKWARD;
                } else {
                    // assign a value and check if there is a conflict
                    ++copy[nx][ny];
                    if (sudoku_correct(copy, nx, ny)) {
                        state = STATE_STEP_FORWARD;
                    }
                }
                break;
            case STATE_STEP_FORWARD:
                if (EOS(nx, ny)) {
                    // the end of the sudoku was reached without a conflict
                    state = STATE_SOLVED;
                } else {
                    // go forward until a non-empty square was reached
                    INC_COORD(nx, ny)
                    if (sudoku[nx][ny] == EMPTY_SQUARE) state = STATE_SOLVE;
                }
                break;
            case STATE_STEP_BACKWARD:
                if (BOS(nx, ny)) {
                    // the beginning of the Sudoku was reached therefore it is irresolvable
                    state = STATE_IRRESOLVABLE;
                } else {
                    // go backward until a non-empty square was reached
                    DEC_COORD(nx, ny)
                    if (sudoku[nx][ny] == EMPTY_SQUARE) state = STATE_SOLVE;
                }
                break;
            case STATE_SOLVED:
                copy_sudoku(copy, sudoku);
                unallocate_sudoku(copy);
                return 0;
            case STATE_IRRESOLVABLE:
                copy_sudoku(copy, sudoku);
                unallocate_sudoku(copy);
                return 1;
        }
    }
}
Beispiel #13
0
void ParseAPart(APartDataType *data)
{
	size_t len = strlen(data->Src);
	try
	{
		char *finder=data->Src;
		char *prev1,*prev2,*prev3;

		while(finder<=(data->Src+len))
		{
			while(ENDLINEWS(finder)) finder++;

			//at the start of line
			if (finder>data->Src){
				if (*(finder-2)=='\r' || *(finder-2)=='\n') 
					*(finder-2)=0;
				if (*(finder-1)=='\r' || *(finder-1)=='\n') 
					*(finder-1)=0;
			}
			prev1=finder;

			while(*finder!=':' && !EOS(finder) && !ENDLINE(finder)) finder++;
			if (ENDLINE(finder)||EOS(finder)){
				// no ":" in the line? here the body begins;
				data->body = prev1;
				break;
			}
			prev2=finder++;

			while(WS(finder) && !EOS(finder)) finder++;
			if(!EOS(finder))
				prev3=finder;
			else
				break;

			do
			{
				if(ENDLINEWS(finder)) finder+=2;						//after endline information continues
				while(!ENDLINE(finder) && !EOS(finder)) finder++;
			}while(ENDLINEWS(finder));

			if (!_strnicmp(prev1,"Content-type",prev2-prev1)){
				data->ContType = prev3;
			} else if (!_strnicmp(prev1,"Content-Transfer-Encoding",prev2-prev1)){
				data->TransEnc = prev3;
			}

			if(EOS(finder))
				break;
			finder++;
			if(ENDLINE(finder)) {
				finder++;
				if(ENDLINE(finder)) {
					// end of headers. message body begins
					if (finder>data->Src){
						if (*(finder-2)=='\r' || *(finder-2)=='\n') 
							*(finder-2)=0;
						if (*(finder-1)=='\r' || *(finder-1)=='\n') 
							*(finder-1)=0;
					}
					finder++;
					if(ENDLINE(finder))finder++;
					prev1 = finder;
					while (!EOS(finder+1))finder++;
					if (ENDLINE(finder))finder--;
					prev2 = finder;
					if (prev2>prev1){ // yes, we have body
						data->body = prev1;
					}
					break; // there is nothing else
				}
			}
		}
	}
	catch(...)
	{
		MessageBox(NULL,_T("Translate header error"),_T(""),0);
	}
	if (data->body) data->bodyLen = (int)strlen(data->body);
}