/alps/pcitool

To get this branch, use:
bzr branch http://darksoft.org/webbzr/alps/pcitool

« back to all changes in this revision

Viewing changes to pcilib/unit.c

  • Committer: Suren A. Chilingaryan
  • Date: 2015-10-08 18:04:37 UTC
  • Revision ID: csa@suren.me-20151008180437-mvqzda4bzd45s023
Base functions for views

Show diffs side-by-side

added added

removed removed

Lines of Context:
9
9
#include "error.h"
10
10
 
11
11
 
12
 
pcilib_unit_t pcilib_find_unit_by_name(pcilib_t *ctx, const char *unit) {
 
12
static pcilib_unit_transform_t pcilib_unit_transform_null = { NULL, NULL };
 
13
 
 
14
pcilib_unit_t pcilib_find_unit_by_name(pcilib_t *ctx, const char *name) {
13
15
    pcilib_unit_t i;
14
16
 
15
17
    for(i = 0; ctx->units[i].name; i++) {
16
 
        if (!strcasecmp(ctx->units[i].name, unit))
 
18
        if (!strcasecmp(ctx->units[i].name, name))
17
19
            return i;
18
20
    }
19
21
    return PCILIB_UNIT_INVALID;
20
22
}
21
23
 
 
24
pcilib_unit_transform_t *pcilib_find_transform_by_unit_names(pcilib_t *ctx, const char *from, const char *to) {
 
25
    int i;
 
26
    pcilib_unit_t unit;
 
27
 
 
28
    if ((!from)||(!to))
 
29
        return NULL;
 
30
 
 
31
    if (!strcasecmp(from, to)) 
 
32
        return &pcilib_unit_transform_null;
 
33
 
 
34
    unit = pcilib_find_unit_by_name(ctx, from);
 
35
    if (unit == PCILIB_UNIT_INVALID) return NULL;
 
36
 
 
37
    for (i = 0; ctx->units[unit].transforms[i].unit; i++) {
 
38
        if (!strcasecmp(ctx->units[unit].transforms[i].unit, to))
 
39
            return &ctx->units[unit].transforms[i];
 
40
    }
 
41
 
 
42
    return NULL;
 
43
}
22
44
 
23
45
int pcilib_add_units(pcilib_t *ctx, size_t n, const pcilib_unit_description_t *desc) {
24
46
    if (!n) {
47
69
 
48
70
    return 0;
49
71
}
 
72
 
 
73
 
 
74
int pcilib_transform_unit(pcilib_t *ctx, pcilib_unit_transform_t *trans, pcilib_value_t *value) {
 
75
    int err;
 
76
 
 
77
    err = pcilib_py_eval_string(ctx, trans->transform, value);
 
78
    if (err) return err;
 
79
 
 
80
    value->unit = trans->unit;
 
81
    return 0;
 
82
}
 
83
 
 
84
 
 
85
int pcilib_transform_unit_by_name(pcilib_t *ctx, const char *to, pcilib_value_t *value) {
 
86
    pcilib_unit_transform_t *trans;
 
87
 
 
88
    if (!value->unit) {
 
89
        pcilib_warning("Can't transform unit of the value with unspecified unit");
 
90
        return PCILIB_ERROR_INVALID_ARGUMENT;
 
91
    }
 
92
 
 
93
    trans = pcilib_find_transform_by_unit_names(ctx, value->unit, to);
 
94
    if (!trans) {
 
95
        pcilib_warning("Can't transform unit (%s) to (%s)", value->unit, to);
 
96
        return PCILIB_ERROR_NOTSUPPORTED;
 
97
    }
 
98
 
 
99
    return pcilib_transform_unit(ctx, trans, value);
 
100
}