private string[] HandleLabels(IPositionableInputStream input, Context assemblyContext, ILog log, string[] code) { string labelName = code[0].TrimEnd(':'); if (IsValidLableName(labelName)) { assemblyContext.AddLabel(labelName); } else { log.AddError(input.GetErrorString( string.Format("Invalid label name {0}", labelName))); } string[] temp = new string[code.Length - 1]; Array.Copy(code, 1, temp, 0, temp.Length); code = temp; return(code); }
private string[] HandleLabels(IPositionableInputStream input, Context assemblyContext, ILog log, string[] code) { string labelName = code[0].TrimEnd(':'); if (IsValidLableName(labelName)) { assemblyContext.AddLabel(labelName); } else { log.AddError(input.GetErrorString( string.Format("Invalid label name {0}", labelName))); } string[] temp = new string[code.Length - 1]; Array.Copy(code, 1, temp, 0, temp.Length); code = temp; return code; }
private IEnumerable<KeyValuePair<INamed<string>, string[]>> FirstPass(IPositionableInputStream input, Context assemblyContext, ILog log) { while (true) { string line = input.ReadLine(); if (line == null) break; string[] code = Nintenlord.Utility.Parser.SplitToParameters(line); if (code.Length > 0) { if (code[0].EndsWith(":")) { code = HandleLabels(input, assemblyContext, log, code); } if (code.Length == 0) continue; IBuiltInCode builtIn; if (buildInCodes.TryGetValue(code[0], out builtIn)) { string error; if (builtIn.Matches("Code " + code[0], code.Length - 1, out error)) { var causedError = builtIn.FirstPass(code, assemblyContext); if (causedError) { log.AddError(input.GetErrorString(causedError.ErrorMessage)); } yield return new KeyValuePair<INamed<string>, string[]>(builtIn, code); } else { log.AddError(input.GetErrorString(error)); } } else { ICodeTemplate template = codeStorage.FindTemplate(code); if (template != null) { if (assemblyContext.Offset % template.OffsetMod != 0) { log.AddError(input.GetErrorString( string.Format( "Code {0}'s offset {1} is not divisible by {2}", template.Name, assemblyContext.Offset, template.OffsetMod ))); } assemblyContext.Offset += template.GetLengthBytes(code); yield return new KeyValuePair<INamed<string>, string[]>(template, code); } else { log.AddError(input.GetErrorString(string.Format( "No code named {0} with {1} parameters found", code[0], code.Length - 1 ))); } } } } }
private IEnumerable <KeyValuePair <INamed <string>, string[]> > FirstPass(IPositionableInputStream input, Context assemblyContext, ILog log) { while (true) { string line = input.ReadLine(); if (line == null) { break; } string[] code = Nintenlord.Utility.Parser.SplitToParameters(line); if (code.Length > 0) { if (code[0].EndsWith(":")) { code = HandleLabels(input, assemblyContext, log, code); } if (code.Length == 0) { continue; } IBuiltInCode builtIn; if (buildInCodes.TryGetValue(code[0], out builtIn)) { string error; if (builtIn.Matches("Code " + code[0], code.Length - 1, out error)) { var causedError = builtIn.FirstPass(code, assemblyContext); if (causedError) { log.AddError(input.GetErrorString(causedError.ErrorMessage)); } yield return(new KeyValuePair <INamed <string>, string[]>(builtIn, code)); } else { log.AddError(input.GetErrorString(error)); } } else { ICodeTemplate template = codeStorage.FindTemplate(code); if (template != null) { if (assemblyContext.Offset % template.OffsetMod != 0) { log.AddError(input.GetErrorString( string.Format( "Code {0}'s offset {1} is not divisible by {2}", template.Name, assemblyContext.Offset, template.OffsetMod ))); } assemblyContext.Offset += template.GetLengthBytes(code); yield return(new KeyValuePair <INamed <string>, string[]>(template, code)); } else { log.AddError(input.GetErrorString(string.Format( "No code named {0} with {1} parameters found", code[0], code.Length - 1 ))); } } } } }