internal static void ExtractAndReplacePreciseTimeSource()

in csharp/EPAM.Deltix.HdTime/Formatter.cs [233:280]


		internal static void ExtractAndReplacePreciseTimeSource(
			ref String timeSource,
			Int32 preciseTimeFormatPosition,
			Int32 preciseTimeFormatSymbolsCount,
			Boolean isLowerCaseFormat, 
			out Byte preciseTimeSource, 
			out Int32 preciseTimeSourceSymbolsCount)
		{
			Boolean isUpperCaseFormat = !isLowerCaseFormat;
			// find
			Int32 preciseTimeSourcePosition = 0;
			preciseTimeSourceSymbolsCount = isUpperCaseFormat
				? FindPreciseTimeSourceLength(timeSource, preciseTimeFormatPosition, preciseTimeFormatSymbolsCount, out preciseTimeSourcePosition)
				: preciseTimeFormatSymbolsCount;

			// extract
			preciseTimeSource = (Byte)ConstructNumberFromChars(
				timeSource,
				isUpperCaseFormat ? preciseTimeSourcePosition : preciseTimeFormatPosition, // if upper case, we use changed source position. it is <= preciseTimeFormatPosition.
				preciseTimeSourceSymbolsCount,
				preciseTimeFormatSymbolsCount == 1 ? 2 : preciseTimeFormatSymbolsCount //
			);

			// in case when there is lossy upper case format and the last byte is lost.
			// we do not need additional F symbol in format
			// because parsing exact in DateTime will fail. (format will not be as the source).
			if (isUpperCaseFormat && preciseTimeSource % 10 == 0)  // some part of source can be lost.
			{
				if (preciseTimeSource == 0)
				{   // preciseTime.TimestampModulo == 0   =>  we insert special symbols foreach expected nanos format symbol. 
					// There are can be 2 or 1 symbols. Depends on preciseTimeFormatSymbolsCount
					timeSource = timeSource.Insert(preciseTimeSourcePosition, preciseTimeFormatSymbolsCount == 2 ? DoubledSupersedingStirng : SupersedingString);	
				}
				else
				{
					if (preciseTimeFormatSymbolsCount == 2) // only ones is lost. so we insert special symbol onto the ones position.
					{
						timeSource = timeSource.Insert(preciseTimeSourcePosition + 1, SupersedingString);	
					}
				}
			}
			
			// replace existing nano source chars.
			ReplaceChars(timeSource, preciseTimeFormatPosition, preciseTimeSourceSymbolsCount, SupersedingChar);
			
			// we do not need to remember the length of the preciseTimeSourceLength
			// we can find out from preciseTimeSource, preciseTimeFormatPosition, preciseTimeFormatSymbolsCount and isLowerCaseFormat
		}