blob: e7ff6866b7e1eaa1c4c1a499fa35f5a684e14e57 [file] [log] [blame]
graham sanderson26653ea2021-01-20 10:44:27 -06001/*
2 * Copyright (c) 2020 Raspberry Pi (Trading) Ltd.
3 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 */
6
7#include <iostream>
8#include "pio_assembler.h"
9
10#define DEFAULT_OUTPUT_FORMAT "c-sdk"
11
12void usage() {
13 std::cerr << "usage: pioasm <options> <input> (<output>)\n\n";
14 std::cerr << "Assemble file of PIO program(s) for use in applications.\n";
15 std::cerr << " <input> the input filename\n";
16 std::cerr << " <output> the output filename (or filename prefix if the output format produces multiple outputs).\n";
17 std::cerr << " if not specified, a single output will be written to stdout\n";
18 std::cerr << "\n";
19 std::cerr << "options:\n";
20 std::cerr << " -o <output_format> select output_format (default '" << DEFAULT_OUTPUT_FORMAT << "'); available options are:\n";
graham sanderson2d5789e2021-02-01 10:04:34 -060021 for(const auto& f : output_format::all()) {
graham sanderson26653ea2021-01-20 10:44:27 -060022 std::cerr << " " << f->name << std::endl;
23 std::cerr << " " << f->get_description() << std::endl;
24 }
25 std::cerr << " -p <output_param> add a parameter to be passed to the output format generator" << std::endl;
26 std::cerr << " -?, --help print this help and exit\n";
27}
28
29int main(int argc, char *argv[]) {
30 int res = 0;
31 pio_assembler pioasm;
32 std::string format(DEFAULT_OUTPUT_FORMAT);
33 const char *input = nullptr;
34 const char *output = nullptr;
35 std::vector<std::string> options;
36 int i = 1;
37 for (; !res && i < argc; i++) {
38 if (argv[i][0] != '-') break;
39 if (argv[i] == std::string("-o")) {
Graham Sanderson0a320232021-10-08 09:01:56 -050040 if (++i < argc) {
graham sanderson26653ea2021-01-20 10:44:27 -060041 format = argv[i];
42 } else {
43 std::cerr << "error: -o requires format value" << std::endl;
44 res = 1;
45 }
46 } else if (argv[i] == std::string("-p")) {
Graham Sanderson0a320232021-10-08 09:01:56 -050047 if (++i < argc) {
graham sanderson26653ea2021-01-20 10:44:27 -060048 options.emplace_back(argv[i]);
49 } else {
50 std::cerr << "error: -p requires parameter value" << std::endl;
51 res = 1;
52 }
53 } else if (argv[i] == std::string("-?") || argv[i] == std::string("--help")) {
54 usage();
55 return 1;
56 } else {
57 std::cerr << "error: unknown option " << argv[i] << std::endl;
58 res = 1;
59 }
60 }
61 if (!res) {
62 if (i != argc) {
63 input = argv[i++];
64 } else {
65 std::cerr << "error: expected input filename\n";
66 res = 1;
67 }
68 }
69 if (!res) {
70 if (i != argc) {
71 output = argv[i++];
72 } else {
73 output = "-";
74 }
75 }
76 if (!res && i != argc) {
77 std::cerr << "unexpected command line argument " << argv[i] << std::endl;
78 res = 1;
79 }
80 std::shared_ptr<output_format> oformat;
81 if (!res) {
graham sanderson2d5789e2021-02-01 10:04:34 -060082 const auto& e = std::find_if(output_format::all().begin(), output_format::all().end(),
graham sanderson26653ea2021-01-20 10:44:27 -060083 [&](const std::shared_ptr<output_format> &f) {
84 return f->name == format;
85 });
graham sanderson2d5789e2021-02-01 10:04:34 -060086 if (e == output_format::all().end()) {
graham sanderson26653ea2021-01-20 10:44:27 -060087 std::cerr << "error: unknown output format '" << format << "'" << std::endl;
88 res = 1;
89 } else {
90 oformat = *e;
91 }
92 }
93 if (res) {
94 std::cerr << std::endl;
95 usage();
96 } else {
97 res = pioasm.generate(oformat, input, output, options);
98 }
99 return res;
100}