Changeset 8409


Ignore:
Timestamp:
Oct 11, 2019, 2:52:19 PM (2 years ago)
Author:
Simon Leischnig
Message:

Plugin: LFSR: Improved Polynom to tap sequence regex parsing

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/CrypPlugins/LFSR/Core/LFSRImplementation.cs

    r8407 r8409  
    144144                    Log(ConvertTo.InputErrorToString(e), LogLevels.Warning);
    145145                }
     146                this.ChangeStateToWontcomplete(e);
    146147            }
    147148        }
     
    338339                var polynom = Fun.RemoveWhitespace(rawPolynomString);
    339340                List<(int, bool)> positions = new List<(int, bool)>();
    340                 Regex mathPos = new Regex(@"^x^(\d+)");
     341                Regex mathPos = new Regex(@"^(x\^(\d+)|x|1)\+?");
    341342                Regex boolPos = new Regex(@"^[01]");
    342343
    343344                String remaining = polynom;
    344345                bool hasMathMatch = false;
    345                 int lastBoolMatchPos = -1;
     346                int lastBoolMatchPos = 0;
     347                (int,bool) parsedPos = default;
    346348
    347349                while(remaining.Length > 0)
    348350                {
    349                     Match match;
    350 
    351                     match = mathPos.Match(remaining);
    352                     if (match.Success)
     351                    int hasParsed = -1;
     352
     353                    //TODO: leading 1+ doesnt work yet
     354                    var matchMath = mathPos.Match(remaining);
     355                    if (matchMath.Success)
    353356                    {
    354                         hasMathMatch = true;
    355                         if (lastBoolMatchPos > -1) throw new LFSRInputInvalidException(InputInvalidReason.MixedPolyFormat);
    356                         positions.Add((Convert.ToInt32(match.Groups[1].Value), true));
     357                        if (hasMathMatch && matchMath.Groups[1].Value.Equals("1"))
     358                        {
     359                            if (lastBoolMatchPos > 0) throw new LFSRInputInvalidException(InputInvalidReason.MixedPolyFormat);
     360
     361                            parsedPos = (0, true);
     362                            hasParsed = matchMath.Value.Length;
     363                            hasMathMatch = true;
     364                        }
     365                        else if(matchMath.Groups[1].Value.Equals("x"))
     366                        {
     367                            if (lastBoolMatchPos > 0) throw new LFSRInputInvalidException(InputInvalidReason.MixedPolyFormat);
     368                            parsedPos = (1, true);
     369                            hasParsed = matchMath.Value.Length;
     370                            hasMathMatch = true;
     371                        }
     372                        else if(matchMath.Groups[0].Value.StartsWith("x"))
     373                        {
     374                            if (lastBoolMatchPos > 0) throw new LFSRInputInvalidException(InputInvalidReason.MixedPolyFormat);
     375                            parsedPos = (Convert.ToInt32(matchMath.Groups[2].Value), true);
     376                            hasParsed = matchMath.Value.Length;
     377                            hasMathMatch = true;
     378                        }
    357379                    }
    358                     else
     380
     381                    var matchBool = boolPos.Match(remaining);
     382                    if ((hasParsed<0) && matchBool.Success)
    359383                    {
    360                         match = boolPos.Match(remaining);
    361                         if (match.Success)
    362                         {
    363                             if (hasMathMatch) throw new LFSRInputInvalidException(InputInvalidReason.MixedPolyFormat);
    364                             lastBoolMatchPos++;
    365                             positions.Add((Convert.ToInt32(lastBoolMatchPos), match.Groups[0].Value == "0" ? false : true));
    366                         }
     384                        if (hasMathMatch) throw new LFSRInputInvalidException(InputInvalidReason.MixedPolyFormat);
     385                        lastBoolMatchPos++;
     386                        parsedPos = (lastBoolMatchPos, matchBool.Groups[0].Value == "0" ? false : true);
     387                        hasParsed = matchBool.Value.Length;
    367388                    }
    368                     if (match.Success)
     389
     390                    if (hasParsed > -1)
    369391                    {
    370                         remaining = remaining.Substring(match.Value.Length);
     392                        positions.Add(parsedPos);
     393                        remaining = remaining.Substring(hasParsed);
    371394                        continue;
    372395                    }
     
    380403                    setPositions.Add(pos.Item1);
    381404                }
     405
    382406                positions.Sort((pos1, pos2) => pos1.Item1 > pos2.Item1 ? 1 : -1);
     407                if (positions[0].Item1 == 0)
     408                {
     409                    positions.RemoveAt(0);
     410                }
    383411                if (! positions[positions.Count-1].Item2)
    384412                {
     
    388416                var result = new List<Boolean>();
    389417
    390                 for (int i = 0; i < positions.Count; i++)
     418                for (int i = 0; i < positions[positions.Count-1].Item1; i++)
    391419                    result.Add(false);
    392420                foreach ((int ord, bool val) pos in positions)
    393                     result[pos.ord] = pos.val;
     421                    result[pos.ord-1] = pos.val;
    394422
    395423                return new Polynom(result);
Note: See TracChangeset for help on using the changeset viewer.