List <IngredientDetail> Split(String ingredientString) { List <IngredientDetail> ingredients = new List <IngredientDetail>(); enumMode parseMode = enumMode.normalMode; int i = 0; String ingredient; ingredient = ""; int parenNestingLevel, squareBracketNestingLevel; parenNestingLevel = 0; squareBracketNestingLevel = 0; containsLessThanSomePerCent = 0; try { while (true) { switch (parseMode) { case enumMode.normalMode: switch (ingredientString.Substring(i, 1)) { case ",": // We found the end of an ingredient. Add it to the list and start over. AddIngredient(ingredient, ingredients); ingredient = ""; i++; break; case "[": squareBracketNestingLevel++; parseMode = enumMode.inNestingMode; ingredient += ingredientString.Substring(i, 1); i++; break; case "(": parenNestingLevel++; parseMode = enumMode.inNestingMode; ingredient += ingredientString.Substring(i, 1); i++; break; default: ingredient += ingredientString.Substring(i, 1); i++; break; } break; case enumMode.inNestingMode: switch (ingredientString.Substring(i, 1)) { case "]": // There are some ingredient lists that have un-matched [] pairs. There don't seem to be unmatched () pairs but... if (squareBracketNestingLevel > 0) { squareBracketNestingLevel--; } if (squareBracketNestingLevel == 0 && parenNestingLevel == 0) { parseMode = enumMode.normalMode; ingredient += ingredientString.Substring(i, 1); } i++; break; case ")": // There are some ingredient lists that have un-matched [] pairs. There don't seem to be unmatched () pairs but... if (parenNestingLevel > 0) { parenNestingLevel--; } if (parenNestingLevel == 0 && squareBracketNestingLevel == 0) { parseMode = enumMode.normalMode; ingredient += ingredientString.Substring(i, 1); squareBracketNestingLevel = 0; // Force the square bracket nesting to be closed. It's dirty data! } i++; break; case "[": squareBracketNestingLevel++; ingredient += ingredientString.Substring(i, 1); i++; break; case "(": parenNestingLevel++; ingredient += ingredientString.Substring(i, 1); i++; break; default: ingredient += ingredientString.Substring(i, 1); i++; break; } break; } } } catch (Exception ex) { Utils.Log(ex.Message); } AddIngredient(ingredient, ingredients); return(ingredients); }
// ########### Sets and Gets ########### // Set the mode in which the SpectraCyber will operate private void SetMode(enumMode eMode) { // TODO: Allow mode switching to take place in the Command Queue // so that one may schedule scanning proceesses meMode = eMode; }