rockbox/apps/plugins/lib/button_helper.pl

99 lines
2.6 KiB
Perl
Raw Normal View History

#!/usr/bin/env perl
############################################################################
# __________ __ ___.
# Open \______ \ ____ ____ | | _\_ |__ _______ ___
# Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
# Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
# Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
# \/ \/ \/ \/ \/
# $Id$
#
# Copyright (C) 2009 by Maurus Cuelenaere
# Copyright (C) 2021 by William Wilgus
#
# All files in this archive are subject to the GNU General Public License.
# See the file COPYING in the source tree root for full license agreement.
#
# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
# KIND, either express or implied.
#
############################################################################
#expects -dM -E source input on STDIN
use strict;
use warnings;
my $svnrev = '$Revision$';
my @buttons = ();
my $count = 1; #null sentinel
my $val;
my $def;
while(my $line = <STDIN>)
{
chomp($line);
if($line =~ /^#define (BUTTON_[^\s]+) (.+)$/)
{
$def = "{\"$1\", $2},\n";
$val = $2;
if($val =~ /^0/)
{
$val = oct($val)
}
else
{
$val = 0xFFFFFFFF; #only used for sorting
}
push(@buttons, {'name' => $1, 'value' => $val, 'def' => $def});
$count = $count + 1;
}
}
my @sorted = sort { @$a{'value'} <=> @$b{'value'} } @buttons;
print <<EOF
/* Don't change this file! */
/* It is automatically generated of button.h */
#include "plugin.h"
#include "button.h"
#include "button_helper.h"
static const struct available_button buttons[$count] = {
EOF
;
$count--; # don't count the sentinel
foreach my $button (@sorted)
{
printf " %s", @$button{'def'};
}
print <<EOF
{"\\0", 0} /* sentinel */
};
const int available_button_count = $count;
const struct available_button * const available_buttons = buttons;
int get_button_names(char *buf, size_t bufsz, unsigned long button)
{
int len = 0;
buf[0] = '\\0';
const struct available_button *btn = buttons;
while(btn->name[0] != '\\0')
{
if(btn->value == 0)
{
if (button == 0)
{
buf[0] = '\\0';
len = rb->strlcat(buf, btn->name, bufsz);
return len;
}
}
else if ((button & btn->value) == btn->value)
{
if (len > 0)
rb->strlcat(buf, " | ", bufsz);
len = rb->strlcat(buf, btn->name, bufsz);
}
btn++;
}
return len;
}
EOF
;