static int SkipSpace(char *text, char *text2)
{
 int erg, lgkl, daz, index, inmakro;
 char *zaehler;

 index = 0;
 lgkl = 0;
 daz = 0;
 inmakro = 0;
 zaehler = text2;

 while ((*text == ' ' || *text == '=' || *text == '\t') && index < ueIdx) { text++; index++; }
 erg = index;
 if (*text == '{') {
   lgkl += 1;
   index++;
   text++; 
   inmakro = 0;
 }
 else if (*text == '"') {
   daz += 1;
   index++;
   text++; 
   inmakro = 0;
 }
 else {
   *zaehler++ = '@';
   *zaehler++ = *text;
   index++;
   text++; 
   inmakro = 1;
 }
 while (index < ueIdx) {
   if (isalnum(*text)) {
     if (lgkl < 1 && daz < 1 && (inmakro==0)) {
       if (text[index-1] != ' ') 
	 *zaehler++ = ' ';
       *zaehler++ = '@';
       *zaehler++ = *text;
       inmakro = 1;
     }
     else {                        /* Zeichen in String */
       *zaehler++ = *text;
     }
     text++;
     index++;
   } 
   else if (*text == '{') {
     if (lgkl >= 1 || daz >= 1) {  /* Klammer in String */
       *zaehler++ = *text;
     }
     text++;                       /* Klammer nach Zaun */
     index++;
     lgkl += 1;
     inmakro = 0;
   }
   else if (*text == '\n') {
     *zaehler++ = *text;
     text++;
     index++;
     while ((*text == ' ') || (*text == '\t')){
        text++;
	index++;
	}
     inmakro = 0;
   }
   else if (*text == '}') {
     if ((lgkl > 1) || (daz >= 1)) {
       *zaehler++ = *text;
     } 
     text++;
     index++;
     lgkl -= 1;
     inmakro = 0;
   }
   else if (*text == '"') {
     if (lgkl >= 1) {
       *zaehler++ = *text;
       text++;
       index++;
     } 
     else {
       text++;
       index++;
       if (daz == 0) daz++;
       else daz = 0;
     }
     inmakro = 0;
   }
   else if (*text == '#') {        /* Space vor/nach Konkatenation */
     if (lgkl < 1 && daz < 1) {
       if (text[index-1] != ' ')
          *zaehler++ = ' ';
       *zaehler++ = '@';
       *zaehler++ = *text;
       if (text[index+1] != ' ')
          *zaehler++ = ' ';
     }
     else {                        /* Konkatenation in String */
       *zaehler++ = *text;
     }
     text++;
     index++;
     inmakro = 0;
   } 
   else if (*text == ',') {        /* Komma am Ende */
     if (lgkl < 1 && daz != 1) break;
     else {
       *zaehler++ = *text;
       text++;
       index++;
     }
     inmakro = 0;
   }
   else if (*text == ')') {        /* runde Klammer am Ende */
     if (lgkl < 1 && daz != 1) break;
     else {
       *zaehler++ = *text;
       text++;
       index++;
     }
     inmakro = 0;
   }
   else if (*text == '@') {        /* @ */
     *zaehler++ = *text;
     *zaehler++ = *text;
     text++;
     index++;
     inmakro = 0;
   } 
   else if (*text == '-') {        /* - */
     *zaehler++ = *text;
     text++;
     index++;
   } 
   else {                        /* sonstiges Zeichen in String */
     *zaehler++ = *text;
     text++;
     index++;
     inmakro = 0;
   } 
 }
 *zaehler++ = '\0';
 return erg;
}

static long WriteLineToFile(FILE *datei, char *feld, char *inh)
{
  int inmakro = 0;    /* weder Makro, noch String */
  int instring = 0;
  int isempty = 1;
  int zaehler;
  long pos; 
  char *blank, *blankptr, *zeichen; 
  
  blank = (char *)XtMalloc(100);
  blankptr = blank;

  for (zaehler = 0; zaehler < fld_indent; zaehler++)
     fprintf(datei," ");
  fprintf(datei,"%s", feld);
  zaehler += strlen(feld);
  for (;zaehler < cont_indent - 3; zaehler++)
     fprintf(datei," ");
  fprintf(datei," = ");
  zeichen = inh;
  while (*zeichen!='\0'){
   switch (*zeichen){
     case ' ':
     case '\t':
	  if (instring)
	     *blankptr++ = *zeichen;
          else if (inmakro){
	     fprintf(datei, " ");
	     inmakro = 0;
	     }
          break;
     case '\n':
	  if (instring){
	     *blankptr++ = *zeichen;
	     for (zaehler = 0; zaehler < newline_indent; zaehler++)
	        *blankptr++ = ' ';
             }
          else if (inmakro){
	     fprintf(datei, " ");
	     inmakro = 0;
	     }
          break;
     case '@':
          if (inmakro)
	     fprintf(datei, " ");
          else if (*(zeichen+1) == '@'){
	     if (instring){
		*blankptr++ = '\0';
		fprintf(datei, "%s", blank);
		blankptr = blank;
		}
             else {
	        fprintf(datei, "{");
		instring=1;
		}
	     fprintf(datei, "@");
	     zeichen++;
	     }
          else if (instring){
	     fprintf(datei, "} ");
	     inmakro = 1;
	     instring = 0;
	     }
          else {
	     inmakro = 1;
	     instring = 0;
	     }
          break;
     case '#':
          if (isempty && inmakro) {
	     fprintf(datei, "{ } #");
             blankptr = blank;
	     *blankptr = '\0';
	     inmakro = 0;
	     }
          else if (inmakro){
	     fprintf(datei, "# ");
             blankptr = blank;
	     *blankptr = '\0';
	     inmakro = 0;
	     }
          else if (instring) 
	     fprintf(datei, "#");
          else {
	     fprintf(datei, "{#");
	     instring = 1;
	     }
          break;
      default:
          isempty = 0;
          if (inmakro)
	     fprintf(datei, "%c", *zeichen);
          else if (instring){
	     *blankptr++ = '\0';
	     fprintf(datei, "%s", blank);
	     blankptr = blank;
	     fprintf(datei, "%c", *zeichen);
	     }
          else{
	     fprintf(datei, "{%c", *zeichen);
	     instring = 1;
	     inmakro = 0;
	     }
          break;
      } /* case */
  zeichen++;
  } /* while */
	   
  if ((isempty==1) && (inmakro==0) && (instring==0))
    fprintf(datei,"{ }");    
  else if (instring) {
    fprintf(datei,"}");    
  }
        
  pos = ftell(datei);
  fprintf(datei,",\n");
  XtFree(blank);
  return pos;
}

static void WriteRecToFile(CardData *card, FILE *datei)
{
 UserFld *h;
 String newType;
 long pos;
 FieldName i;

 fseek(datei, 0L, SEEK_END); 
 fprintf(datei,"\n");
 pos = ftell(datei);
 newType = glbNewString(card->cardtypestr);
 fprintf(datei,"@%s{%s",newType, card->mainkey);
 XtFree(newType);
 pos = ftell(datei);
 fprintf(datei,",\n");

 for (i=0; i<max_fields; i++) {
    if (!StringIsPeteEmpty(card->field[i]))
       pos = WriteLineToFile(datei, glbFldToName(i), card->field[i]);
 }
 h = card->ufield; 
 while (h) {
   if (!StringIsPeteEmpty(h->fldData)) 
      pos = WriteLineToFile(datei,h->fldName,h->fldData);    
   h = h->next;
 }   
 fseek(datei, pos, SEEK_SET);
 fprintf(datei,"\n}\n\n");
}


