1#include "int_route/int_model.h"
2
3#include <stdlib.h>
4#include <string.h>
5#include <stdio.h>
6#include <inttypes.h>
7#include <assert.h>
8
9#define UINT64_T_HEX_LENGTH 18
10#define SEP_LENGTH 1
11#define PARAM_NAME "int_model="
12
13errval_t int_startup_argument_init(struct int_startup_argument * arg) {
14    memset(arg, 0, sizeof(struct int_startup_argument));
15    return SYS_ERR_OK;
16}
17
18/*
19 *  Turn an int_startup_argument into a string
20 *  out must be free'd by the caller.
21 */
22errval_t int_startup_argument_to_string(struct int_startup_argument * arg, char ** out) {
23    int out_len = strlen(PARAM_NAME) + 3*UINT64_T_HEX_LENGTH + 2*SEP_LENGTH + 1;
24    if(strlen(arg->msix_ctrl_name) > 0){
25        out_len += strlen(SEP_LENGTH + arg->msix_ctrl_name);
26    }
27    *out = malloc(out_len);
28    assert(*out);
29    snprintf(*out, out_len, PARAM_NAME "%d:%"PRIx64":%"PRIx64,
30            (int)arg->model,
31            arg->int_range_start, arg->int_range_end);
32
33    // append msix ctlr name
34    if(strlen(arg->msix_ctrl_name)){
35        strcat(*out, ":");
36        strcat(*out, arg->msix_ctrl_name);
37    }
38    return SYS_ERR_OK;
39}
40
41/* Parse a argv string into a int_startup_argument */
42errval_t int_startup_argument_parse(char * in, struct int_startup_argument * out) {
43    if(strncmp(in, PARAM_NAME, strlen(PARAM_NAME)) == 0) {
44        int name_start = -1;
45        int m = sscanf(in, PARAM_NAME "%d:%"SCNx64":%"SCNx64":%n",
46                (int*)&(out->model),
47                &(out->int_range_start),
48                &(out->int_range_end),
49                &name_start);
50        if(name_start > -1){
51           strcpy(out->msix_ctrl_name, in + name_start);
52        }
53
54        if(m == 3) return SYS_ERR_OK;
55    }
56    return SYS_ERR_IRQ_NO_ARG;
57}
58