166 lines
4.9 KiB
Plaintext
166 lines
4.9 KiB
Plaintext
////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Microsoft Research Singularity
|
|
//
|
|
// Copyright (c) Microsoft Corporation. All rights reserved.
|
|
//
|
|
// File: SbUtils.cs
|
|
// StringBuilder Utility Class
|
|
// Note:
|
|
//
|
|
|
|
using System;
|
|
using System.Text;
|
|
using Microsoft.Singularity.Channels;
|
|
|
|
#if !SINGULARITY_PROCESS
|
|
namespace Microsoft.Singularity.Directory
|
|
#else
|
|
using Microsoft.Singularity;
|
|
using Microsoft.Singularity.V1.Services;
|
|
namespace Microsoft.Application.DSP
|
|
#endif
|
|
{
|
|
public class SbUtils
|
|
{
|
|
private const char delimiter = '/';
|
|
|
|
public static bool IsTail(StringBuilder! sb)
|
|
{
|
|
if (sb.Length <= 1) return false;
|
|
int pos = IndexOf(sb,delimiter,1);
|
|
if (pos == -1) return true;
|
|
return false;
|
|
}
|
|
public static int IndexOf (StringBuilder! sb, char theChar, int startPos)
|
|
{
|
|
if (sb.Length == 0) return 0;
|
|
for (int i = startPos ; i < sb.Length; i++) {
|
|
if (sb[i] == theChar) return i;
|
|
}
|
|
return -1;
|
|
}
|
|
|
|
public static int LastIndexOf (StringBuilder! sb, char theChar, int startPos)
|
|
{
|
|
if (sb.Length == 0) return 0;
|
|
for (int i = sb.Length ; i > startPos+1 ; i--) {
|
|
if (sb[i-1] == theChar) return i;
|
|
}
|
|
return -1;
|
|
}
|
|
|
|
public static bool Empty (StringBuilder! sb)
|
|
{
|
|
if ( sb.Length > 0) {
|
|
return true;
|
|
}
|
|
else {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
public int Length(StringBuilder! sb)
|
|
{
|
|
return sb.Length;
|
|
}
|
|
|
|
public static StringBuilder! StripLast(StringBuilder! sb)
|
|
{
|
|
int pos = LastIndexOf(sb,delimiter,0);
|
|
if (pos == -1) {
|
|
sb.Length = 1; // just the delimiter
|
|
}
|
|
else if ( (pos+1) < sb.Length ) {
|
|
sb.Length = pos-1;
|
|
}
|
|
else {
|
|
sb.Length = 0;
|
|
}
|
|
return sb;
|
|
}
|
|
|
|
|
|
public static StringBuilder! RemoveFirstElement(StringBuilder! sb, out int charCount)
|
|
{
|
|
return StripFirst(sb, out charCount);
|
|
}
|
|
|
|
public static StringBuilder! StripFirst(StringBuilder! sb, out int charCount)
|
|
{
|
|
charCount = 0;
|
|
if ( sb[0] == delimiter){
|
|
charCount = 1;
|
|
int pos = IndexOf(sb, delimiter,1); // just in case it starts with '/'
|
|
if ( (pos >= 0) && (pos < sb.Length ) ) {
|
|
charCount = pos;
|
|
sb.Remove(0,pos);
|
|
return sb;
|
|
}
|
|
charCount = sb.Length;
|
|
sb.Length = 0;
|
|
return sb;
|
|
}
|
|
else {
|
|
int pos = IndexOf(sb,delimiter,0); // just in case it starts with '/'
|
|
if ( (pos >= 0) && (pos < sb.Length ) ){
|
|
charCount = pos;
|
|
sb.Remove(0,pos);
|
|
return sb;
|
|
}
|
|
charCount = sb.Length;
|
|
sb.Length = 0;
|
|
return sb;
|
|
}
|
|
}
|
|
|
|
public static void Append(StringBuilder! sb, String! elt)
|
|
{
|
|
sb.Append(elt);
|
|
}
|
|
|
|
// Return a st
|
|
//
|
|
public static String FirstElement(StringBuilder! sb)
|
|
{
|
|
if (sb.Length == 0) return null;
|
|
|
|
if ( sb[0] == delimiter){
|
|
int pos = IndexOf(sb,delimiter,1);
|
|
|
|
// DebugStub.WriteLine(" FindFirst:pos={0},len={1},s={2}",__arglist(pos,sb.Length,sb.ToString()));
|
|
//DebugStub.Break();
|
|
if (pos == -1) {
|
|
if (sb.Length == 1) return null; // just the delimiter
|
|
return sb.ToString(1,sb.Length-1);
|
|
}
|
|
if ( (pos > 1) && (pos < sb.Length ) ) {
|
|
return sb.ToString(1,pos-1);
|
|
}
|
|
return null;
|
|
}
|
|
else {
|
|
int pos = IndexOf(sb,delimiter,0);
|
|
if (pos == -1) {
|
|
return sb.ToString();
|
|
}
|
|
if ( (pos < sb.Length) && (pos > 0) ){
|
|
return sb.ToString(0,pos);
|
|
}
|
|
return null;
|
|
}
|
|
}
|
|
|
|
public static String PathString(StringBuilder! sb)
|
|
{
|
|
if (sb.Length == 0 ) return null;
|
|
return sb.ToString();
|
|
}
|
|
|
|
public static char[]! in ExHeap PathVector(StringBuilder! sb)
|
|
{
|
|
return Bitter.FromString2(sb.ToString());
|
|
}
|
|
}
|
|
}
|