/* Generated by re2c 1.3 on Wed Mar  4 13:32:28 2020 */
#line 1 "led_pattern.h.in"
/*

LED MODULE

Copyright (C) 2020 by Maxim Prokhorov <prokhorov dot max at outlook dot com>

*/

#pragma once

#include "led.h"

#include <cstring>

// Scans input string with format
// '<on1>,<off1>,<repeats1> <on2>,<off2>,<repeats2> ...'
// Directly changing `LedPattern::delays` contents

void _ledLoadPattern(led_t& led, const char* input) {
    char buffer[16];

    const char* d1;
    const char* d2;
    const char* d3;

    const char* p = input;
    const char* marker;

    auto& pattern = led.pattern();
    pattern.delays.clear();

loop:
const char *yyt1;const char *yyt2;const char *yyt3;

#line 37 "led_pattern.h"
	{
		char yych;
		static const unsigned char yybm[] = {
			  0,   0,   0,   0,   0,   0,   0,   0, 
			  0,  64,   0,   0,   0,   0,   0,   0, 
			  0,   0,   0,   0,   0,   0,   0,   0, 
			  0,   0,   0,   0,   0,   0,   0,   0, 
			 64,   0,   0,   0,   0,   0,   0,   0, 
			  0,   0,   0,   0,   0,   0,   0,   0, 
			128, 128, 128, 128, 128, 128, 128, 128, 
			128, 128,   0,   0,   0,   0,   0,   0, 
			  0,   0,   0,   0,   0,   0,   0,   0, 
			  0,   0,   0,   0,   0,   0,   0,   0, 
			  0,   0,   0,   0,   0,   0,   0,   0, 
			  0,   0,   0,   0,   0,   0,   0,   0, 
			  0,   0,   0,   0,   0,   0,   0,   0, 
			  0,   0,   0,   0,   0,   0,   0,   0, 
			  0,   0,   0,   0,   0,   0,   0,   0, 
			  0,   0,   0,   0,   0,   0,   0,   0, 
			  0,   0,   0,   0,   0,   0,   0,   0, 
			  0,   0,   0,   0,   0,   0,   0,   0, 
			  0,   0,   0,   0,   0,   0,   0,   0, 
			  0,   0,   0,   0,   0,   0,   0,   0, 
			  0,   0,   0,   0,   0,   0,   0,   0, 
			  0,   0,   0,   0,   0,   0,   0,   0, 
			  0,   0,   0,   0,   0,   0,   0,   0, 
			  0,   0,   0,   0,   0,   0,   0,   0, 
			  0,   0,   0,   0,   0,   0,   0,   0, 
			  0,   0,   0,   0,   0,   0,   0,   0, 
			  0,   0,   0,   0,   0,   0,   0,   0, 
			  0,   0,   0,   0,   0,   0,   0,   0, 
			  0,   0,   0,   0,   0,   0,   0,   0, 
			  0,   0,   0,   0,   0,   0,   0,   0, 
			  0,   0,   0,   0,   0,   0,   0,   0, 
			  0,   0,   0,   0,   0,   0,   0,   0, 
		};
		yych = (char)*p;
		if (yybm[0+yych] & 64) {
			goto yy4;
		}
		if (yych <= '/') goto yy2;
		if (yych <= '9') {
			yyt1 = p;
			goto yy7;
		}
yy2:
		++p;
yy3:
#line 45 "led_pattern.h.in"
		{ return; }
#line 88 "led_pattern.h"
yy4:
		yych = (char)*++p;
		if (yybm[0+yych] & 64) {
			goto yy4;
		}
#line 46 "led_pattern.h.in"
		{ goto loop; }
#line 96 "led_pattern.h"
yy7:
		yych = (char)*(marker = ++p);
		if (yybm[0+yych] & 128) {
			goto yy10;
		}
		if (yych != ',') goto yy3;
yy8:
		yych = (char)*++p;
		if (yych <= '/') goto yy9;
		if (yych <= '9') {
			yyt2 = p;
			goto yy12;
		}
yy9:
		p = marker;
		goto yy3;
yy10:
		yych = (char)*++p;
		if (yybm[0+yych] & 128) {
			goto yy10;
		}
		if (yych == ',') goto yy8;
		goto yy9;
yy12:
		yych = (char)*++p;
		if (yych == ',') goto yy14;
		if (yych <= '/') goto yy9;
		if (yych <= '9') goto yy12;
		goto yy9;
yy14:
		yych = (char)*++p;
		if (yych <= '/') goto yy9;
		if (yych >= ':') goto yy9;
		yyt3 = p;
yy15:
		yych = (char)*++p;
		if (yych <= '/') goto yy17;
		if (yych <= '9') goto yy15;
yy17:
		d1 = yyt1;
		d2 = yyt2;
		d3 = yyt3;
#line 47 "led_pattern.h.in"
		{
            unsigned long on;
            unsigned long off;
            unsigned char repeats;

            memcpy(buffer, d1, int(d2 - d1));
            buffer[int(d2 - d1 - 1)] = '\0';
            on = strtoul(buffer, nullptr, 10);

            memcpy(buffer, d2, int(d3 - d2));
            buffer[int(d3 - d2 - 1)] = '\0';
            off = strtoul(buffer, nullptr, 10);

            memcpy(buffer, d3, int(p - d3));
            buffer[int(p - d3)] = '\0';
            repeats = strtoul(buffer, nullptr, 10);

            pattern.delays.emplace_back(on, off, repeats);

            goto loop;
        }
#line 163 "led_pattern.h"
	}
#line 70 "led_pattern.h.in"

}
