#ifndef __COMMON_H #define __COMMON_H #include #include #include #include #include #include #include "../lib/const.h" #ifndef _CMDLINE_FILE #error _CMDLINE_FILE constant not defined! #else #include _CMDLINE_FILE #endif /************************************************** * Stale dotyczace wejscia/wyjscia */ #define EMPTYFORM '*' #define INFIELD_SEP ':' #define MAXAUX 16 #define FIELD_SEP " \t\n" #define FIELD_PREFIX_MAXLEN 32 // katalogi z plikami konfiguracyjnymi // nowe // stare - do wyrzucenia // #define CONFIG_DIR ".utt/conf" // nazwa zmiennej okreslajaca sciezke do danych // #define UTT_DIR_VAR "UTT_DIR" // sciezka do plikow z danymi (np UTT_DIR/pliki) wzgledem $HOME! // #define UTT_DIR_DEFAULT ".utt/pl/" /**************************************************/ extern FILE* inputf; extern FILE* outputf; extern FILE* failedf; extern char* input_filename; extern char* output_filename; extern char* failed_filename; extern bool one_line; extern bool one_field; extern char input_field_prefix[]; extern char output_field_prefix[]; extern bool copy_processed; extern bool append_output; extern bool append_failed; //sciezka do katalogu z danymi extern char utt_dir[]; extern void process_common_options(gengetopt_args_info* args, char* argv0); extern void process_config_files(gengetopt_args_info* args, char* argv0); extern int expand_path(char* inpath, char* outpath); /************************************************** * problems with casing */ // sprawdzenie wielkosci liter // warto¶æ zwracana: // 0 - wszystkie ma³e litery // 1 - pierwsza wielka, reszta male // 2 - wszystkie wielkie // 3 - inne inline int casing(char* s) { int ret = isupper(*s) ? 1 : 0; while(*++s != '\0') { if(isupper(*s)) { if(ret==1) ret=2; else if(ret==0) ret=3; } else { if(ret==2) ret=3; } } return ret; } // inline void tolowers(char* s, char* d) { *d=tolower(*s); while(*s != '\0') * ++d = tolower(* ++s); } // przepisuje s do d // nadajac wielko¶æ liter zgodnie z warto¶ci± casing // casing - warto¶æ zwracana przez casing() // je¶li casing==3 przepisuje bez zmian (za ma³o informacji) inline void restorecasing(char *s, char *d, int casing) { switch(casing) { case 0: case 3: *d=*s; while(*s != '\0') * ++d = * ++s; break; case 1: *d=toupper(*s); while(*s != '\0') * ++d = * ++s; break; case 2: *d=toupper(*s); while(*s != '\0') * ++d = toupper(* ++s); break; } } /**************************************************/ /* parameters: -seg - segment -pref - field name or "1", "2", "3", "4" for the first four fields +val - field contents return value: 1 if specified field exists, 0 otherwise */ inline int getfield(char* seg, const char* pref, char* val) { char* p=seg; char* p0; while(isspace(*p)) ++p; // field "1" p0=p; while(isdigit(*p)) ++p; if(*pref=='1') if(p!=p0) { strncpy(val,p0,p-p0); val[p-p0]='\0'; return 1; } else return 0; while(isspace(*p)) ++p; // field "2" p0=p; while(isdigit(*p)) ++p; if(*pref=='2') if(p!=p0) { strncpy(val,p0,p-p0); val[p-p0]='\0'; return 1; } else return 0; while(isspace(*p)) ++p; // field "3" p0=p; while(isgraph(*p)) ++p; if(*pref=='3') if(p!=p0) { strncpy(val,p0,p-p0); val[p-p0]='\0'; return 1; } else return 0; while(isspace(*p)) ++p; // field "4" p0=p; while(isgraph(*p)) ++p; if(*pref=='4') if(p!=p0) { strncpy(val,p0,p-p0); val[p-p0]='\0'; return 1; } else return 0; while(isspace(*p)) ++p; // annotation fields do p=strstr(p,pref); while(p!=NULL && *(p-1)!=' ' && *(p-1)!='\t'); if(p==NULL) return 0; else { p+=strlen(pref); int len=strcspn(p,FIELD_SEP "\n\r\f\0"); strncpy(val,p,len); val[len]='\0'; return 1; } } inline int getfield(wchar_t* seg, const wchar_t* pref, wchar_t* val) { wchar_t* p=seg; wchar_t* p0; while(iswspace(*p)) ++p; // field "1" p0=p; while(iswdigit(*p)) ++p; if(*pref==L'1') if(p!=p0) { wcsncpy(val,p0,p-p0); val[p-p0]=L'\0'; return 1; } else return 0; while(iswspace(*p)) ++p; // field "2" p0=p; while(iswdigit(*p)) ++p; if(*pref==L'2') if(p!=p0) { wcsncpy(val,p0,p-p0); val[p-p0]=L'\0'; return 1; } else return 0; while(iswspace(*p)) ++p; // field "3" p0=p; while(iswgraph(*p)) ++p; if(*pref==L'3') if(p!=p0) { wcsncpy(val,p0,p-p0); val[p-p0]=L'\0'; return 1; } else return 0; while(iswspace(*p)) ++p; p0=p; while(iswgraph(*p)) ++p; if(*pref==L'4') if(p!=p0) { wcsncpy(val,p0,p-p0); val[p-p0]=L'\0'; return 1; } else return 0; while(iswspace(*p)) ++p; // annotation fields do p=wcsstr(p,pref); while(p!=NULL && *(p-1)!=L' ' && *(p-1)!=L'\t'); if(p==NULL) return 0; else { p+=wcslen(pref); int len=wcscspn(p,FIELD_SEP L"\n\r\f\0"); wcsncpy(val,p,len); val[len]=L'\0'; return 1; } } /* parameters: -name - field name, long or short +prefix - field name with ':' appended if long name return value: 1 if correct field name, 0 otherwise examples: name prefix r.v. lem lem: 1 @ @ 1 :: 'undef' 0 a,b 'undef' 0 */ inline int fieldprefix(char *name, char *prefix) { if (ispunct(name[0]) && name[1]=='\0') // correct short name { strcpy(prefix, name); return 1; } int i=0; while(name[i]!='\0' && isalnum(name[i])) ++i; if(name[i]=='\0' && i>0) // correct long name { sprintf(prefix,"%s:",name); return 1; } // incorrect return 0; } inline bool process_seg(char* seg, gengetopt_args_info& args) { char buf[256]; char pref[FIELD_PREFIX_MAXLEN]; bool ret = !args.process_given; if(args.process_given) { getfield(seg,"3",buf); for(int i=0; i= MAX_LINE) return 0; // bezpieczniej, ale wolniej int seglen=strlen(seg); sprintf(seg+(seglen-1)," %s%s\n",pref,val); return 1; } /**************************************************/ struct Seg { int filepos, len; char* tag; char* form; char* aux[MAXAUX]; int auxn; bool parse(char* line); char* getfield(char* fieldname); void print(char* line); bool addfield(char* s); bool clearfields(); }; /**************************************************/ /* definicja struktury wejscia/wyjscia */ struct Segment { int filepos, len; char* tag; char* form; char* aux[MAXAUX]; int auxn; bool parse(char* line); char* getfield(char* fieldname); void print(char* line); bool addfield(char* s); bool clearfields(); }; /* * Sprawdza czy nalezy przetwarzac dany segment. */ inline bool process_seg(Segment& s, gengetopt_args_info& args) { bool ret = !args.process_given; for(int i=0; i