예제 #1
0
        protected override bool Run()
        {
            if (input == null)
            {
                Computation input_lookup = new Lookup(master, source_reference, new [] { "arg" }, context);
                input_lookup.Notify(input_result => {
                    if (input_result is Stringish)
                    {
                        input = input_result.ToString();
                        if (Interlocked.Decrement(ref interlock) == 0)
                        {
                            master.Slot(this);
                        }
                    }
                    else
                    {
                        master.ReportOtherError(source_reference, "Input argument must be a string.");
                    }
                });
                master.Slot(input_lookup);

                if (Interlocked.Decrement(ref interlock) > 0)
                {
                    return(false);
                }
            }
            var frame = new Frame(master, master.NextId(), source_reference, context, container);

            for (int it = 0; it < input.Length; it++)
            {
                frame[TaskMaster.OrdinalNameStr(it + 1)] = (long)Char.ConvertToUtf32(input, it);
            }
            result = frame;
            return(true);
        }
예제 #2
0
 public Frame(TaskMaster task_master, SourceReference source_ref, Context context, Frame container)
 {
     this.task_master = task_master;
     SourceReference  = source_ref;
     Context          = Context.Prepend(this, context);
     Container        = container ?? this;
     Id = TaskMaster.OrdinalName(task_master.NextId());
 }
예제 #3
0
        protected override bool Run()
        {
            if (!state)
            {
                var input_lookup = new Lookup(master, source_ref, new [] { "args" }, context);
                input_lookup.Notify(HandleArgs);
                master.Slot(input_lookup);
                var transformation_lookup = new Lookup(master, source_ref, new [] { "transformations" }, context);
                transformation_lookup.Notify(HandleTransformations);
                master.Slot(transformation_lookup);
                state = true;
                if (Interlocked.Decrement(ref interlock) > 0)
                {
                    return(false);
                }
            }
            var output_frame = new Frame(master, master.NextId(), source_ref, context, self);

            for (var index = 0; index < input.Length; index++)
            {
                var buffer = new StringBuilder();
                for (var it = 0; it < input[index].Length; it += Char.IsSurrogatePair(input[index], it) ? 2 : 1)
                {
                    var    c            = Char.ConvertToUtf32(input[index], it);
                    var    is_surrogate = Char.IsSurrogatePair(input[index], it);
                    string replacement;
                    if (single_substitutions.TryGetValue(c, out replacement))
                    {
                        buffer.Append(replacement);
                    }
                    else
                    {
                        bool matched = false;
                        foreach (var range in ranges.Values)
                        {
                            if (c >= range.start && c <= range.end)
                            {
                                var utf8 = new byte[4];

                                Encoding.UTF8.GetBytes(input[index], it, is_surrogate ? 2 : 1, utf8, 0);
                                buffer.Append(String.Format(range.replacement, c, (int)input[index][it], is_surrogate ? (int)input[index][it + 1] : 0, (int)utf8[0], (int)utf8[1], (int)utf8[2], (int)utf8[3]));
                                matched = true;
                                break;
                            }
                        }
                        if (!matched)
                        {
                            buffer.Append(Char.ConvertFromUtf32(c));
                        }
                    }
                }
                output_frame[TaskMaster.OrdinalNameStr(index)] = new SimpleStringish(buffer.ToString());
            }
            result = output_frame;
            return(true);
        }
예제 #4
0
        protected override bool Run()
        {
            if (mappings.Count == 0)
            {
                interlock = categories.Count + 2;
                Computation input_lookup = new Lookup(master, source_reference, new [] { "arg" }, context);
                input_lookup.Notify(input_result => {
                    if (input_result is Stringish)
                    {
                        input = input_result.ToString();
                        if (Interlocked.Decrement(ref interlock) == 0)
                        {
                            master.Slot(this);
                        }
                    }
                    else
                    {
                        master.ReportOtherError(source_reference, "Input argument must be a string.");
                    }
                });
                master.Slot(input_lookup);

                foreach (var entry in categories)
                {
                    var lookup = new Lookup(master, source_reference, new [] { entry.Value }, context);
                    lookup.Notify(cat_result => {
                        mappings[entry.Key] = cat_result;
                        if (Interlocked.Decrement(ref interlock) == 0)
                        {
                            master.Slot(this);
                        }
                    });
                    master.Slot(lookup);
                }

                if (Interlocked.Decrement(ref interlock) > 0)
                {
                    return(false);
                }
            }
            var frame = new Frame(master, master.NextId(), source_reference, context, container);

            for (int it = 0; it < input.Length; it++)
            {
                frame[TaskMaster.OrdinalNameStr(it + 1)] = mappings[Char.GetUnicodeCategory(input[it])];
            }
            result = frame;
            return(true);
        }
예제 #5
0
 public Frame(TaskMaster task_master, SourceReference source_ref, Context context, Frame container) : this(TaskMaster.OrdinalName(task_master.NextId()), source_ref, context, container)
 {
 }