source: app/src/common/common.h @ ac7d970

help
Last change on this file since ac7d970 was ac7d970, checked in by pawelk <pawelk@…>, 16 years ago

Uaktualnilismy kora.

git-svn-id: svn://atos.wmid.amu.edu.pl/utt@23 e293616e-ec6a-49c2-aa92-f4a8b91c5d16

  • Property mode set to 100644
File size: 8.3 KB
Line 
1#ifndef __COMMON_H
2#define __COMMON_H
3
4#include <stdio.h>
5#include <ctype.h>
6#include <string.h>
7#include <stdlib.h>
8
9#include "../lib/const.h"
10
11#include _CMDLINE_FILE
12
13
14/**************************************************
15 * Stale dotyczace wejscia/wyjscia
16 */
17
18#define EMPTYFORM '*'
19#define INFIELD_SEP ':'
20#define MAXAUX 16
21#define FIELD_SEP " \t\n"
22
23
24// katalogi z plikami konfiguracyjnymi
25// nowe
26// stare - do wyrzucenia
27// #define CONFIG_DIR ".utt/conf"
28
29// nazwa zmiennej okreslajaca sciezke do danych
30
31// #define UTT_DIR_VAR "UTT_DIR"
32
33// sciezka do plikow z danymi (np UTT_DIR/pliki) wzgledem $HOME!
34
35// #define UTT_DIR_DEFAULT ".utt/pl/"
36
37/**************************************************/
38
39
40extern FILE* inputf;
41extern FILE* outputf;
42extern FILE* failedf;
43
44extern char* input_filename;
45extern char* output_filename;
46extern char* failed_filename;
47extern bool one_line;
48extern bool one_field;
49
50extern char input_field_prefix[];
51extern char output_field_prefix[];
52
53extern bool copy_processed;
54extern bool append_output;
55extern bool append_failed;
56
57//sciezka do katalogu z danymi
58extern char utt_dir[];
59
60extern void process_common_options(gengetopt_args_info* args, char* argv0);
61extern void process_config_files(gengetopt_args_info* args, char* argv0);
62
63extern int expand_path(char* inpath, char* outpath);
64
65extern int fieldprefix(char *name, char *prefix);
66
67
68/**************************************************
69 * problems with casing                           */
70// sprawdzenie wielkosci liter
71// warto¶æ zwracana:
72// 0 - wszystkie ma³e litery
73// 1 - pierwsza wielka, reszta male
74// 2 - wszystkie wielkie
75// 3 - inne
76inline int casing(char* s)
77{
78  int ret = isupper(*s) ? 1 : 0;
79  while(*++s != '\0')
80  {
81    if(isupper(*s))
82    {
83      if(ret==1) ret=2;
84      else if(ret==0) ret=3;
85    }
86    else
87    {
88      if(ret==2) ret=3;
89    }
90  }
91  return ret;
92}
93
94//
95inline void tolowers(char* s, char* d)
96{
97  *d=tolower(*s);
98  while(*s != '\0') * ++d = tolower(* ++s);
99}
100
101
102// przepisuje s do d
103// nadajac wielko¶æ liter zgodnie z warto¶ci± casing
104// casing - warto¶æ zwracana przez casing()
105// je¶li casing==3 przepisuje bez zmian (za ma³o informacji)
106inline void restorecasing(char *s, char *d, int casing)
107{
108  switch(casing)
109  {
110  case 0:
111  case 3:
112    *d=*s;
113    while(*s != '\0') * ++d = * ++s;
114    break;
115  case 1:
116    *d=toupper(*s);
117    while(*s != '\0') * ++d = * ++s;
118    break;
119  case 2:
120    *d=toupper(*s);
121    while(*s != '\0') * ++d = toupper(* ++s);
122    break;
123  }
124}
125
126/**************************************************/
127
128/*
129parameters:
130  -seg  - segment
131  -pref - field name or "1", "2", "3", "4" for the first four fields
132  +val  - field contents
133return value:
134  1 if specified field exists, 0 otherwise
135*/
136
137inline int getfield(char* seg, const char* pref, char* val)
138{
139
140  char* p=seg;
141  char* p0;
142
143  while(isspace(*p)) ++p;
144
145  // field "1"
146  p0=p; while(isdigit(*p)) ++p;
147  if(*pref=='1') if(p!=p0) { strncpy(val,p0,p-p0); val[p-p0]='\0'; return 1; } else return 0;
148 
149  while(isspace(*p)) ++p;
150
151  // field "2"
152  p0=p; while(isdigit(*p)) ++p;
153  if(*pref=='2') if(p!=p0) { strncpy(val,p0,p-p0); val[p-p0]='\0'; return 1; } else return 0;
154
155  while(isspace(*p)) ++p;
156
157  // field "3"
158  p0=p; while(isgraph(*p)) ++p; 
159  if(*pref=='3') if(p!=p0) { strncpy(val,p0,p-p0); val[p-p0]='\0'; return 1; } else return 0;
160
161  while(isspace(*p)) ++p;
162
163  // field "4"
164  p0=p; while(isgraph(*p)) ++p;
165  if(*pref=='4') if(p!=p0) { strncpy(val,p0,p-p0); val[p-p0]='\0'; return 1; } else return 0;
166
167  while(isspace(*p)) ++p;
168
169  // annotation fields
170  do p=strstr(p,pref); while(p!=NULL && *(p-1)!=' ' && *(p-1)!='\t');
171 
172  if(p==NULL) return 0;
173  else
174  {
175    p+=strlen(pref);
176    int len=strcspn(p,FIELD_SEP "\n\r\f\0");
177    strncpy(val,p,len);
178    val[len]='\0';
179    return 1;
180  }
181}
182
183
184inline
185bool process_seg(char* seg, gengetopt_args_info& args)
186{
187  char buf[256];
188  bool ret = !args.process_given;
189  if(args.process_given)
190    {
191      getfield(seg,"3",buf);
192      for(int i=0; i<args.process_given; ++i)
193        if(strcmp(args.process_arg[i],buf)==0)
194          {
195            ret=true;
196            break;
197          }
198    }
199  for(int i=0; i<args.select_given; ++i)
200    if(! getfield(seg,args.select_arg[i],buf))
201      ret=false;
202  for(int i=0; i<args.ignore_given; ++i)
203    if(getfield(seg,args.ignore_arg[i],buf))
204      ret=false;
205  return ret;
206}
207
208
209/*
210parameters:
211  -+seg - segment
212  -pref - prefix of the new field
213  -val  - contents of the new field
214return value:
215  1 - success, 0 - fail (limit on segment length exceeded)
216 */
217inline
218int addfield(char *seg, const char *pref, const char *val)
219     // zalozenie, ze seg konczy sie znakiem \n
220{
221  if(strlen(seg)+strlen(pref)+strlen(val) >= MAX_LINE) return 0; // bezpieczniej, ale wolniej
222
223  int seglen=strlen(seg);
224  sprintf(seg+(seglen-1)," %s%s\n",pref,val);
225  return 1;
226}
227
228/**************************************************/
229
230struct Seg
231{
232  int filepos, len;
233  char* tag;
234  char* form;
235  char* aux[MAXAUX];
236  int auxn;
237
238  bool parse(char* line);
239  char* getfield(char* fieldname);
240  void print(char* line);
241  bool addfield(char* s);
242  bool clearfields();
243};
244
245/**************************************************/
246
247/* definicja struktury wejscia/wyjscia
248 */
249struct Segment
250{
251  int filepos, len;
252  char* tag;
253  char* form;
254  char* aux[MAXAUX];
255  int auxn;
256
257  bool parse(char* line);
258  char* getfield(char* fieldname);
259  void print(char* line);
260  bool addfield(char* s);
261  bool clearfields();
262};
263
264/*
265 * Sprawdza czy nalezy przetwarzac dany segment.
266 */
267
268inline
269bool process_seg(Segment& s, gengetopt_args_info& args)
270{
271  bool ret = !args.process_given;
272
273  for(int i=0; i<args.process_given; ++i)
274    if(strcmp(args.process_arg[i],s.tag)==0)
275      {
276        ret=true;
277        break;
278      }
279
280  for(int i=0; i<args.select_given; ++i)
281    if(! s.getfield(args.select_arg[i]))
282      ret=false;
283
284  for(int i=0; i<args.ignore_given; ++i)
285    if(s.getfield(args.ignore_arg[i]))
286      ret=false;
287
288  return ret;
289}
290
291
292/*
293 * FUNKCJE OBSLUGUJACE WEJSCIE/WYJSCIE
294 */
295// napisy zostaj na miejscu (w line), tylko wskazniki sa ustawian
296// i zara dopisywane zera s dopisywane
297
298inline
299bool Segment::parse(char* line)
300{
301  auxn=0;
302  char* field;
303  if((field=strtok(line,FIELD_SEP))!=NULL)
304    filepos=atoi(field); // nie sprawdzana poprawnosc
305  else
306    return false;
307  if((field=strtok(NULL,FIELD_SEP))!=NULL)
308    len=atoi(field); // nie sprawdzana poprawnosc
309  else return false;
310  if((tag=strtok(NULL,FIELD_SEP))==NULL) return false;
311  if((form=strtok(NULL,FIELD_SEP))==NULL)
312    return true;
313  else
314    if(form[0] == EMPTYFORM && form[1] =='\0')
315      form=NULL;
316
317  while((aux[auxn]=strtok(NULL,FIELD_SEP))!=NULL) ++auxn;
318
319  return true;
320}
321
322
323inline char* Segment::getfield(char* f)
324{
325  int flen=strlen(f);
326  if(isalnum(*f))
327  {
328    for(int i=0; i<auxn; ++i)
329      if(strncmp(aux[i],f,flen)==0 && aux[i][flen]==INFIELD_SEP)
330        return aux[i]+flen+1;
331  } else
332  {
333    for(int i=0; i<auxn; ++i)
334    {
335      if(*f==*(aux[i]))
336        return aux[i]+1;
337    }
338  }
339  return NULL;
340}
341
342inline bool Segment::clearfields() {
343  for (int i=0; i<auxn; ++i) {
344    //    free(aux[i]);
345    aux[i] = NULL;
346  }
347  auxn=0;
348  return true;
349}
350
351inline // NIEEFEKTYWNE
352void Segment::print(char* line)
353{
354  sprintf(line,"%04d %02d %s", filepos, len, tag);
355  if(form)
356    {
357      strcat(line," ");
358      strcat(line,form);
359    }
360  else
361    if(auxn)
362      strcat(line," *");
363
364  for(int i=0; i<auxn; ++i)
365    {
366      strcat(line," ");
367      strcat(line,aux[i]);
368    }
369
370  strcat(line,"\n");
371}
372
373
374inline
375bool Segment::addfield(char* s)
376{
377  if(auxn<MAXAUX)
378    {
379      aux[auxn++]=s;
380      return true;
381    }
382  else
383    return false;
384}
385
386/**************************************************
387 * funkcje pomocne w operacjach na plikach        *
388 *  konfiguracyjnych                              *
389 **************************************************/
390
391// sprawdza istnienie pliku
392int file_accessible(const char* path);
393
394// sprawdza istnienie pliku konfiguracyjnego
395int config_file(const char* dir, const char* filename);
396
397/**************************************************/
398
399/* Pobiera wejscie
400 * parametry:
401 * - args - tablica stringow okresnajacych pola wejsciowe
402 * - args_len - rozmiar args
403 * - seg - segment
404 * wartosc - wskaznik do wejscia
405 */
406inline char*  getInput(char** args, int args_len, Segment seg) {
407  char* formp = NULL;
408  for (int i=0; i<args_len; ++i) {
409    if ('4' == args[i][0])
410      return seg.form;
411    if ((formp = seg.getfield(args[i])) != NULL) {
412      return formp;
413    }
414  }
415  return formp;
416}
417
418#endif
Note: See TracBrowser for help on using the repository browser.