/*************************************************************************\
  util.c:
        allgemeine Datei- und Stringoperationen zum JPC-Programm
\*************************************************************************/

#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <stdlib.h>
#include <signal.h>
#include <exec/types.h>    /* typedef's für UBYTE etc. */
#include "jpc.h"

int ctrl_c;


void intercept(int class)
/* einfache Ctrl-C-Abfrage, wird über signal(SIGINT, intercept) aktiviert */
{
  ctrl_c = 1;
}


ULONG getlong(FILE *f)
/* Achtung, Intel-Format */
{
  UBYTE b[4];

  fread(b, sizeof(char), 4, f);
  return b[0] | (b[1]<<8) | (b[2]<<16) | (b[3]<<24);
}


ULONG getbytes(FILE *f, int anz)
/* 1..4 Bytes lesen und zu einer LongInt-Zahl zusammenfassen. */
/* Achtung, Intel-Format */
{
  UBYTE b[4];

  fread(b, sizeof(char), anz, f);
  while (anz<4) 
    b[anz++] = 0;
  return b[0] | (b[1]<<8) | (b[2]<<16) | (b[3]<<24);
}


UWORD getword(FILE *f)
/* Achtung, Intel-Format */
{
  UBYTE b;
  
  b = fgetc(f);
  return b | (fgetc(f)<<8);
}


int match(UBYTE s1[], UBYTE s2[], int noabbrev)
/* 0: Gleichheit,  1: s1>s2,  -1: s1<s2,  2: s1!=s2 */
/* s1 darf den Joker '?' enthalten und auf '*' enden. */
/* Teuflisches Detail: bei noabbrev==FALSE darf für Gleichheit s2 auch */
/* eine Abkürzung von s1 sein. */
{
  int i=0, diff=0, joker=0;

  if (*s2 == 255)   /* "Stopper-String" */
    return -1;
  while ((diff == 0) && s1[i] && s2[i] && (s1[i] != '*')) {
    if (s1[i] == '?')
      joker = 1;
    else {
      if (sort[s1[i]]>sort[s2[i]])  diff = 1;
      if (sort[s1[i]]<sort[s2[i]])  diff = -1;
    }
    i++;
  }
  if (diff) {
    /* Abweichung, erst nach dem ersten "?"-Joker? */
    if (joker) diff = 2;  /* ja, keine >/<-Aussage möglich */
  } else if (s1[i] != '*') {
    /* Übereinstimmung, aber nur bis zum Ende von einem der Strings. */
    /* Sind beide zuende? */
    if (s1[i])    /* nein, s1 ist länger */
      if (noabbrev)    /* und hat auch keine Ausnahmegenehmigung */
        diff = 1;
    if (s2[i])    /* nein, s2 ist länger */
      diff = -1;
  }
  if (dbugf) fprintf(dbugf, "\"%s\"%c\"%s\"\n", s1, '='+diff, s2);
  return diff;
}


void civilize(char s[], int numeric)
/* in Großbuchstaben umwandeln, Umlaute durch Umschreibungen ersetzen */
/* für numeric=True andere Funktion: als F10.2 formatieren */
{
  float x;
  int i, j;
  char s2[80];

  if (numeric) {
    x = atof(s);
    sprintf(s, "%10.2f", x);
    while (*s==' ') 
      *s++ = '0';       /* mit führenden Nullen auffüllen */
  } else {
    for (i=j=0; s[i]; i++)
      switch(s[i]) {
        case 'ä': case 'Ä': 
          s2[j++] = 'A'; s2[j++] = 'E'; break;
        case 'ö': case 'Ö': 
          s2[j++] = 'O'; s2[j++] = 'E'; break;
        case 'ü': case 'Ü': 
          s2[j++] = 'U'; s2[j++] = 'E'; break;
        case 'ß': 
          s2[j++] = 'S'; s2[j++] = 'S'; break;
        default: 
          s2[j++] = toupper(s[i]);
      }
    s2[j] = '\0';
    strcpy(s, s2);
  }
}



