//====================================================
StatusCode InputStreamParser::extractStream(const std::string & input) {
  // parses a string containing multiple tag='value',
  // such as: DATAFILE='LFN:/grid/lhcb/data/file.dst' TYP='POOL_ROOTTREE' OPT='READ'

  StatusCode sc = StatusCode::SUCCESS;
  MsgStream log(msgSvc(), name());
  boost::smatch matches;
  boost::match_flag_type flags = boost::match_default;

  // find the file descriptor
  m_regex.assign (c_SREDATA, boost::regex_constants::icase);
  if(boost::regex_search(input.begin(),input.end(), matches, m_regex, flags)) {
    std::string match_descriptor(matches[3].first, matches[3].second);
    m_inCollection->push_back(match_descriptor);
    log << MSG::DEBUG <<  match_descriptor << endmsg ;

  } else {
    log <<MSG::ERROR << "File descriptor not present in: "<< input <<endmsg;
    return StatusCode::FAILURE;
  }

  // check if it is a collection:
  m_regex.assign(c_SRECOLLECTION, boost::regex_constants::icase);
  if(boost::regex_search(input.begin(),input.end(), matches, m_regex, flags)) {
    //     m_isCollection = true;
    std::string ETC(m_inCollection->back());
    m_inCollection->pop_back();
    sc = extractFileReferences(ETC);
  }
  return sc;
}
void descriptors_descriptors_rt(t_descriptors *x, t_symbol *msg, short argc, t_atom *argv)
{
	long descriptor_type;
	long descriptor_num_params = 0;
	long num_pf_descriptors = 0;													
	long num_params = 0;
	long output_pos = 0;
	long num_to_output;

	double *pf_params = x->pf_params;
	
	while (argc)
	{
		// Get descriptor type
		
		descriptor_type = match_descriptor(argv++, 1);
		argc--;
		
		// Bail if no descriptor matched
		
		if (descriptor_type == DESCRIPTOR_PF_NONE)
		{
			error ("descriptors(rt)~: unknown descriptor / incorrectly formatted descriptors - bailing with %ld valid descriptors", num_pf_descriptors);
			break;
		}
		
		// Bail if the descriptor is only for non-realtime use (ie is a per block descriptor)
		
		if (descriptor_type < 0)
		{
			error ("descriptors(rt)~: descriptor available for non real-time only - bailing with %ld valid descriptors", num_pf_descriptors);
			break;
		}
		
		// Parse the descriptor arguments (and store into params)
		
		descriptor_num_params = descriptors_descriptors_pf((enum PFDescriptorType) descriptor_type, pf_params, &argv, &argc, num_params, num_pf_descriptors, &num_to_output, 1);
		
		if (descriptor_num_params)
		{
			// Update variables and pointers
			
			pf_params += descriptor_num_params;
			num_params += descriptor_num_params;
			output_pos += num_to_output;
			
			// Bail if we will have too long an output
			
			if (output_pos > MAX_OUTPUT)
			{
				error ("descriptors(rt)~: too many output values - bailing with %ld valid descriptors", num_pf_descriptors);
				break;
			}
			
			num_pf_descriptors++;
		}
		else 
		{
			break;
		}
	}
	
	// Store variables
	
	x->num_pf_descriptors = num_pf_descriptors;
	x->output_length = output_pos;
	if (x->descriptor_feedback)
		post ("descriptors(rt)~: set %ld descriptors", num_pf_descriptors);
}
void descriptors_descriptors_non_rt (t_descriptors *x, t_symbol *msg, short argc, t_atom *argv)
{	
	long descriptor_type;
	long num_pf_descriptors = 0;
	long num_pb_descriptors = 0;
	long num_pf_params = 0;
	long num_pb_params = 0;
	long descriptor_num_params = 0;
	long output_pos = 0;
	long num_to_output;
	long stats_num_params;
	long output_params_left = MAX_PF_OUTPUT_PARAMS;
	
	double *pf_params = x->pf_params;
	double *pb_params = x->pb_params;
	double *pf_calc_params = x->pf_calc_params;
	
	long *pf_output_params = x->pf_output_params;
	long *pb_pos = x->pb_pos;
	
	x->do_sum_amps = 0;

	while (argc)
	{
		// Get descriptor type
		
		descriptor_type = match_descriptor(argv++, 0);
		argc--;
		
		// Bail if no descriptor is matched
		
		if (descriptor_type == DESCRIPTOR_PF_NONE)
		{
			error ("descriptors(rt)~: unknown descriptor / incorrectly formatted descriptors - bailing with %ld valid descriptors", num_pf_descriptors + num_pb_descriptors);
			break;
		}
		
		if (descriptor_type < 0)
		{
			// Per block descriptors
			
			// Parse the descriptor arguments (and store into params)

			descriptor_num_params = descriptors_descriptors_pb((enum PBDescriptorType)-descriptor_type, pb_params, &argv, &argc, num_pb_params, num_pb_descriptors, &num_to_output);
			
			if (descriptor_num_params)
			{
				// Update variables and pointers

				pb_params += descriptor_num_params;
				num_pb_params += descriptor_num_params;
				pb_pos[num_pb_descriptors] = output_pos;
				output_pos += num_to_output;
				
				// Bail if we will have too long an output

				if (output_pos > MAX_OUTPUT)
				{
					error ("descriptors(rt)~: too many output values - bailing with %ld valid descriptors", num_pf_descriptors + num_pb_descriptors);
					break;
				}
				
				if (-descriptor_type == DESCRIPTOR_PB_SPECTRAL_PEAKS) x
					->do_sum_amps = 1;
				
				num_pb_descriptors++;
			}
			else break;
		}
		else
		{
			// Per frame descriptors
			
			// Parse the descriptor arguments (and store into params)
			
			descriptor_num_params = descriptors_descriptors_pf((enum PFDescriptorType) descriptor_type, pf_params, &argv, &argc, num_pf_params, num_pf_descriptors, &num_to_output, 0);		// Note We Ignore the num_to_output return here
			
			if (descriptor_num_params)
			{
				// Update variables and pointers

				pf_params += descriptor_num_params;
				num_pf_params += descriptor_num_params;
				
				// Parse statistical arguments
				
				stats_num_params = descriptors_descriptors_statistics(pf_output_params, pf_calc_params, &argv, &argc, output_params_left, num_pf_descriptors + num_pb_descriptors, output_pos, &num_to_output);
				
				// Update variables and pointers
				
				output_params_left -= stats_num_params;
				pf_output_params += stats_num_params;
				output_pos += num_to_output;
				pf_calc_params += 12;
				
				// Bail if we will have too long an output
				
				if (output_pos > MAX_OUTPUT)
				{
					error ("descriptors(rt)~: too many output values - bailing with %ld valid descriptors", num_pf_descriptors + num_pb_descriptors);
					break;
				}
				
				num_pf_descriptors++;
			}
			else break;
		}
	}
	
	// Store variables
	
	x->num_pb_descriptors = num_pb_descriptors;
	x->num_pf_descriptors = num_pf_descriptors;
	x->output_length = output_pos;
	if (x->descriptor_feedback)
		post ("descriptors(rt)~: set %ld descriptors", num_pf_descriptors + num_pb_descriptors);
}