add_integer: remove callback parameter
[vlc/asuraparaju-public.git] / modules / video_filter / atmo / DmxTools.cpp
blobfe4c0662e8a3c290860dd163a95483136547bb41
1 /*
2 * DmxTools.cpp: functions to convert , or ; separated numbers into an integer array
4 * See the README.txt file for copyright information and how to reach the author(s).
6 * $Id$
7 */
9 #include <stdlib.h>
10 #include <stdio.h>
11 #include <string.h>
12 #include "DmxTools.h"
14 int IsValidDmxStartString(char *startChannels)
16 if(!startChannels) return -1;
18 char channel[16];
19 int tmp;
20 int ch = 0;
21 int i = 0;
23 while(*startChannels) {
24 if(*startChannels == ',' || *startChannels == ';') {
25 if(i > 0) {
26 channel[i] = 0;
27 // atoi ?
28 tmp = atoi(channel);
29 if((tmp >= 0) && (tmp<=253))
30 ch++;
31 else
32 return -2; // invalid channel number!
33 i = 0;
36 else
38 if((*startChannels >= '0') && (*startChannels <= '9')) {
39 if(i < 3)
40 channel[i++] = *startChannels;
41 else
42 return -3; // invalid index length!
43 } else {
44 if(*startChannels != ' ') {
45 return -4; // invalid character found!
49 startChannels++;
52 // process the rest (or last channel)
53 if(!*startChannels && (i>0)) {
54 channel[i] = 0;
55 tmp = atoi(channel);
56 if((tmp >= 0) && (tmp<=253)) {
57 ch++;
58 } else
59 return -2;
62 return ch;
65 int *ConvertDmxStartChannelsToInt(int numChannels, char *startChannels)
67 if(!numChannels || !startChannels) return NULL;
68 int *channels = new int[numChannels + 1];
69 // tmp buffer to store channel number!
70 char channel[16];
71 int next_dmx_ch = 0;
72 int tmp;
73 int ch = 0;
74 int i = 0;
76 while(*startChannels) {
77 if(*startChannels == ',' || *startChannels == ';') {
78 if(i > 0) {
79 channel[i] = 0;
80 // atoi ?
81 tmp = atoi(channel);
82 if((tmp >= 0) && (tmp<=253)) {
83 next_dmx_ch = tmp + 3;
84 channels[ch++] = tmp;
85 if(ch == numChannels)
86 break;
87 } else
88 break;
89 i = 0;
92 if((*startChannels >= '0') && (*startChannels <= '9')) {
93 if(i < 3)
94 channel[i++] = *startChannels;
95 else
96 break;
98 startChannels++;
101 if(!*startChannels && (i>0)) {
102 channel[i] = 0;
103 tmp = atoi(channel);
104 if((tmp >= 0) && (tmp<=253)) {
105 next_dmx_ch = tmp + 3;
106 channels[ch++] = tmp;
110 // fillup the array with the logical next dmx channels - for simple devices that should work!
112 while(ch < numChannels) {
113 if(next_dmx_ch>253) next_dmx_ch=0; // wrap arround :) better than indexing memory out of range
114 channels[ch++] = next_dmx_ch;
115 next_dmx_ch += 3;
117 channels[ch++] = -1; // last Entry :)
119 return channels;
122 char *ConvertDmxStartChannelsToString(int numChannels, int *startChannels)
124 // maxBufSize worst case having numChannels 256 each 3 digits Adress and one colon 256*4 bytes + zero byte
125 char tmp[1025];
126 // fuck up! (should not happen)
127 if(numChannels > 256) return NULL;
130 char *psz_tmp = tmp;
131 for(int i = 0; i < numChannels; i++) {
132 if(startChannels[i] == -1) break;
133 if(i > 0) {
134 *psz_tmp = ',';
135 psz_tmp++;
136 *psz_tmp = 0;
138 int n = sprintf(psz_tmp, "%d", startChannels[i] );
139 if(n > 0)
140 psz_tmp += n;
143 return strdup(tmp);