<commit_before>﻿using System;
using System.Linq;
using System.Collections.Generic;
using System.Text;

namespace Drkstr.EAN128
{
    public enum GS1State
        {
            E,  // Ingresso con stringa vuota
            L2, // Possibile uscita di lunghezza 2
            L3, // Possibile uscita di lunghezza 3
            L4, // Uscita di lunghezza 4
            EXT // Uscita (parsing dei dati)
        }

    public class GS1Algorithm
    {
        private static char[] FNC1Values = new char[] { (char)29, (char)32 };

        private string _ai;
        /// <summary>
        /// Recupera l'Application Identifier corrente
        /// </summary>
        public string AI { get { return _ai; } }

        private GS1State _state;
        /// <summary>
        /// Recupera lo stato corrente dell'algoritmo
        /// </summary>
        public GS1State State { get { return _state; } }

        private char[] _barcode;
        /// <summary>
        /// Recupera il barcode per cui l'algoritmo è stato istanziato
        /// </summary>
        public char[] Barcode 
        {
            get { return _barcode; }
        }

        public int Index { get; set; }

        /// <summary>
        /// Inizializza un nuovo algoritmo per il parsing di uno specifico barcode
        /// </summary>
        /// <param name="barcode"></param>
        public GS1Algorithm(char[] barcode)
        {
            _ai = "";
            _state = GS1State.E;
            Index = 0;

            _barcode = barcode;
        }

        /// <summary>
        /// Esegue il reset dell'avanzamento del corrente algoritmo ma non cambia il barcode
        /// N.B.: per utilizzare l'algoritmo su un altro barcode è necessario istanziarne uno nuovo
        /// </summary>
        public void ResetAI()
        {
            _ai = "";
            _state = GS1State.E;
        }

        /// <summary>
        /// Recupera il prossimo formato a partire dal primo carattere di Barcode
        /// con indice Index ed avanza l'indice alla prima possizione utile per i dati
        /// </summary>
        /// <returns>Il corrispondente ElementStringFormat</returns>
        /// <exception cref="Drkstr.EAN128.GS1AlgorithmException" /> se si è verificato un errore di parsing
        public ElementStringFormat NextFormat()
        {
            while (this._state != GS1State.EXT)
            {
                SetNextChar(Barcode[Index++]);
            }

            try
            {
                ElementStringFormat format = (ElementStringFormat)EAN128Tokenizer.Formats[AI].Clone();

                // Gestione numero di cifre decimali
                if (StringEquals(AI.Substring(0, 2), new string[] { "31", "32", "33", "34", "35", "36", "39" }))
                {
                    // Si recupera il numero di cifre decimali e si avanza l'indice al carattere successivo
                    int nod = Convert.ToInt32(Barcode[Index++].ToString());
                    format.NumberOfDecimal = nod;
                }

                return format;
            }
            catch (KeyNotFoundException)
            {
                throw new GS1AlgorithmException("AI not found: "+AI);
            }
        }

        /// <summary>
        /// Fa avanzare l'algoritmo per il riconoscimento dell'AI
        /// </summary>
        /// <param name="next">Il carattere successivo</param>
        /// <returns></returns>
        /// <exception cref="Drkstr.GS1AlgorithmException" /> in caso di errore
        private GS1Algorithm SetNextChar(char next)
        {
            if (State == GS1State.E)
            {
                _state = GS1State.L2;
                _ai = _ai + next;
            }
            else if (State == GS1State.L2)
            {
                if (AI.Equals("0"))
                {
                    if (next == '0' || next == '1' || next == '2')
                    {
                        _state = GS1State.EXT;
                        _ai = _ai + next;
                    }
                    else
                    {<commit_msg>Minor fixes<commit_after>﻿using System;
using System.Linq;
using System.Collections.Generic;
using System.Text;

namespace Drkstr.EAN128
{
    public enum GS1State
        {
            E,  // Ingresso con stringa vuota
            L2, // Possibile uscita di lunghezza 2
            L3, // Possibile uscita di lunghezza 3
            L4, // Uscita di lunghezza 4
            EXT // Uscita (parsing dei dati)
        }

    public class GS1Algorithm
    {
        private static char[] FNC1Values = new char[] { (char)29, (char)32 };

        private string _ai;
        /// <summary>
        /// Recupera l'Application Identifier corrente
        /// </summary>
        public string AI { get { return _ai; } }

        private GS1State _state;
        /// <summary>
        /// Recupera lo stato corrente dell'algoritmo
        /// </summary>
        public GS1State State { get { return _state; } }

        private char[] _barcode;
        /// <summary>
        /// Recupera il barcode per cui l'algoritmo è stato istanziato
        /// </summary>
        public char[] Barcode 
        {
            get { return _barcode; }
        }

        public int Index { get; set; }

        /// <summary>
        /// Inizializza un nuovo algoritmo per il parsing di uno specifico barcode
        /// </summary>
        /// <param name="barcode"></param>
        public GS1Algorithm(char[] barcode)
        {
            _ai = "";
            _state = GS1State.E;
            Index = 0;

            _barcode = barcode;
        }

        /// <summary>
        /// Esegue il reset dell'avanzamento del corrente algoritmo ma non cambia il barcode
        /// N.B.: per utilizzare l'algoritmo su un altro barcode è necessario istanziarne uno nuovo
        /// </summary>
        public void ResetAI()
        {
            _ai = "";
            _state = GS1State.E;
        }

        /// <summary>
        /// Recupera il prossimo formato a partire dal primo carattere di Barcode
        /// con indice Index ed avanza l'indice alla prima possizione utile per i dati
        /// </summary>
        /// <returns>Il corrispondente ElementStringFormat</returns>
        /// <exception cref="Drkstr.EAN128.GS1AlgorithmException" /> se si è verificato un errore di parsing
        public ElementStringFormat NextFormat()
        {
            try
            {
                while (this._state != GS1State.EXT)
                {
                    SetNextChar(Barcode[Index++]);
                }

                try
                {
                    ElementStringFormat format = (ElementStringFormat)EAN128Tokenizer.Formats[AI].Clone();

                    // Gestione numero di cifre decimali
                    if (StringEquals(AI.Substring(0, 2), new string[] { "31", "32", "33", "34", "35", "36", "39" }))
                    {
                        // Si recupera il numero di cifre decimali e si avanza l'indice al carattere successivo
                        int nod = Convert.ToInt32(Barcode[Index++].ToString());
                        format.NumberOfDecimal = nod;
                    }

                    return format;
                }
                catch (KeyNotFoundException)
                {
                    throw new GS1AlgorithmException("AI not found: " + AI);
                }
            }
            catch (Exception)
            {
                throw new GS1AlgorithmException("Error occured while parsing format");
            }
        }

        /// <summary>
        /// Fa avanzare l'algoritmo per il riconoscimento dell'AI
        /// </summary>
        /// <param name="next">Il carattere successivo</param>
        /// <returns></returns>
        /// <exception cref="Drkstr.GS1AlgorithmException" /> in caso di errore
        private GS1Algorithm SetNextChar(char next)
        {
            if (State == GS1State.E)
            {
                _state = GS1State.L2;
                _ai = _ai + next;
            }
            else if (State == GS1State.L2)
            {
                if (AI.Equals("0"))
                {
                    if (next == '0' || next == '1' || next == '2')
                    {
                        _state = GS1State.EXT;
                        _ai = _ai + next;
                    }
                    else
                    {
{'fraction_non_alphanumeric': 0.10371166010263755, 'fraction_numerical': 0.014679556032939491, 'mean_word_length': 1.3187603763143332, 'pattern_counts': {'":': 0, '<': 51, '<?xml version=': 0, '>': 51, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '7030262', 'n_tokens_mistral': 2420, 'n_tokens_neox': 2280, 'n_words': 635}