]> git.sesse.net Git - vlc/blob - modules/video_filter/atmo/DmxTools.cpp
Spell "separate"
[vlc] / modules / video_filter / atmo / DmxTools.cpp
1 /*
2  * DmxTools.cpp: functions to convert , or ; separated numbers into an integer array
3  *
4  * See the README.txt file for copyright information and how to reach the author(s).
5  *
6  * $Id$
7  */
8
9 #include <stdlib.h>
10 #include <stdio.h>
11 #include <string.h>
12 #include "DmxTools.h"
13
14 int IsValidDmxStartString(char *startChannels)
15 {
16   if(!startChannels) return -1;
17
18   char channel[16];
19   int tmp;
20   int ch = 0;
21   int i = 0;
22
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;
34          }
35       }
36       else
37       {
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!
46             }
47         }
48       }
49       startChannels++;
50   }
51
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;
60   }
61
62   return ch;
63 }
64
65 int *ConvertDmxStartChannelsToInt(int numChannels, char *startChannels)
66 {
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;
75
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;
90          }
91       }
92       if((*startChannels >= '0') && (*startChannels <= '9')) {
93          if(i < 3)
94             channel[i++] = *startChannels;
95          else
96             break;
97       }
98       startChannels++;
99   }
100
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;
107       }
108   }
109   //
110   // fillup the array with the logical next dmx channels - for simple devices that should work!
111   //
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;
116   }
117   channels[ch++] = -1; // last Entry :)
118
119   return channels;
120 }
121
122 char *ConvertDmxStartChannelsToString(int numChannels, int *startChannels)
123 {
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;
128
129
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;
137       }
138       int n = sprintf(psz_tmp, "%d", startChannels[i] );
139       if(n > 0)
140          psz_tmp += n;
141   }
142
143   return strdup(tmp);
144 }
145