home *** CD-ROM | disk | FTP | other *** search
- /*--------------------------------------------------------*/
- /* SFS.C */
- /* SIMILAR FIELD SEARCH */
- /* Ähnlichkeitsvergleich von strings in Datenfeldern */
- /* */
- /* AUFRUF: ret = sfs(s,d,mode) */
- /* int ret,mode */
- /* char s[],d[] */
- /* */
- /* ret gibt Korrelation von 0 bis 100 an */
- /* SFS_ERR, wenn Strings zu lang */
- /*--------------------------------------------------------*/
-
- #define I_CASE 1 /* Groß- Klein ignorieren,
- bei nicht 1 beachten */
- #define SFS_ERR 9999 /* Fehler - String zu lang */
- #define MAX 100 /* maximale Länge */
-
- #define islower(c) ((c)>='a' && (c)<='z')
- /* Kleinbuchstabe ? */
- #define toupper(c) (islower(c) ? (c)-32 : (c))
- /* mache groß */
- #define max(a,b) ( (a) > (b) ? (a) : (b) ) /* Maximum */
-
-
- /* ------------------------ */
- /* _sfs() */
- /* ------------------------ */
- /*
- Modulinterne Funktion. Wird
- von sfs() benutzt.
- */
- static int _sfs(s,d,mode)
- register char *s; /* Suchfolge */
- register char *d; /* Vergleichsfolge */
- int mode; /* Groß- Kleinschreibung beachten ? */
-
- {
- register int zeile = 0; /* Suchfolge */
- register int spalte = 0; /* Vergleichsfolge */
- int last_1 = 0; /* Merken der letzten Spalte mit 1 */
- int maxsp,maxz; /* Index der Strings */
- register int j; /* allg. Schleifenvariable */
- int sum = 0; /* Gesamtsumme der 1en */
- int sp_sum[MAX]; /* bei Übereinstimmung der Spalte */
-
- maxsp = strlen(d) - 1;
- maxz = strlen(s) - 1;
- if (maxsp > MAX ) return(SFS_ERR); /* zu lang */
-
- for(j = 0;j <= maxsp;j++) sp_sum[j] = 0;
- /* Spaltensummen auf 0 setzen */
- do
- {
- switch(sp_sum[spalte]) /* Spalte bereits 1 */
- {
- case 0: /* Nein */
- if(s[zeile] == d[spalte] || /* vergleichen */
- ( mode & I_CASE &&
- toupper(s[zeile]) == toupper(d[spalte]) ))
- {
- sp_sum[spalte] = 1; /* sind gleich */
- if(++spalte > maxsp)
- zeile = maxz; /* ENDE forcieren */
- last_1 = spalte; /* ++spalte merken*/
- zeile++; /* nächste Zeile */
- }
- else /* Zeichen ungleich */
- {
- if((spalte + 1) > maxsp)/* rechter Rand ? */
- {
- spalte = last_1 ; /* rechts unter
- letzter 1 */
- zeile++;
- }
- else
- spalte++; /* nur nach rechts */
- }
- break;
-
- case 1: /* Ja */
- if(++spalte > maxsp) /* rechter Rand */
- {
- spalte = last_1; /* rechts unter letzte 1 */
- zeile++; /* Zeile runter */
- }
- break;
-
- } /* end switch */
-
- } while(zeile <= maxz);
-
- for(j = 0;j <= maxsp;j++) sum += sp_sum[j];
- /* Summe der Einsen */
- return( 200 * sum / (maxz + maxsp + 2) );
- /* entspricht: 100 * ( (sum/((zeile + spalte)/2) ),
- bloß etwas rechnergerechter umgeformt.
- Das + 2 ergibt sich dadurch, daß der Index
- bei Null anfängt. */
- }
-
- /* ------------------------ */
- /* sfs() */
- /* ------------------------ */
- /*
- Benutzt _sfs() zweimal und
- gibt den größeren Wert zurück.
- */
- int sfs(s,d,mode)
- char *s,*d;
- int mode;
- {
- int sd,ds;
- sd = _sfs(s,d,mode); /* s mit d */
- ds = _sfs(d,s,mode); /* d mit s */
- return(max(sd,ds)); /* gib den größeren Wert zurück */
- }
-