Helmut Schellong / IPAddress Parser
 
StartSeite | HelmutSchellong/ | Neues | TestSeite | ForumSeite | Teilnehmer | Kategorien | Index | Hilfe | Einstellungen | Ändern

Verschoben von LoopUnrolling:

Funktionen zum Testen des korrekten IP-Nummer-Formats

Gemäßigtes Loop-Unrolling, trotzdem noch wenig Kode - optimaler Kompromiß, sehr schnell:

int CkIpFmt(const uchar *s0)      // "127.3.21.4"
{
   register const uchar *s= s0;
   register unsigned v, c, n=4;

   while (1)  {
      v= s[0]-'0';
      if (v>9)  break;
      c= s[1]-'0'; ++s;
      if (c<=9)  {
        v*=10, v+=c;
        if (v<10)  break;
        c= s[1]-'0'; ++s;
        if (c<=9)  {
          ++s; v*=10, v+=c;
          if (v>255)  break;
        }
      }
      if (--n)  { if (s[0]=='.')  { ++s; continue; } }
      else      { if (s[0]==  0)    return (s-s0);   }
      break;
   }
   return (-1);
}

Gegenbeispiel - 2..3-fach langsamer als oben:

int CkIpFmt(const uchar *s0)
{
   const uchar *s;
   register int d;
   register unsigned v;
   register int c;
   int p;

   for (s=s0,v=p=d=0;  (c= *s);  ++s)  {
      if (c>='1'&&c<='9' || c=='0'&&(d||s[1]=='.'||!s[1]))  {
        v*=10u; v+=c-'0';
        ++d;
        continue;
      }
      if (c=='.' && (d==2 || d==3&&v<=255 || d==1))  {
        ++p; v=d=0;
        continue;
      }
      goto ERET;
   }
   if (p==3 && (d==2 || d==3&&v<=255 || d==1))  return (s-s0);
   ERET:  return (-1);
}

--HelmutSchellong


P.S. Das war übrigens der nicht geschwindigkeits-, sondern lesbar- und wartbarkeitsoptimierte Ausgangpunkt (erste Anwort auf eine Frage nach einer solchen Funktion in news:de.comp.lang.c im Juli 2000):

int StrRetRunlenDigit(char *s)
{
  int runlen=0;
  while(isdigit(*s)) {
    s++; runlen++;
  }
  return runlen;
}

int StrChkIpFormat(char *s) /* return -1 on error */
{
  int i;      
  int runlen;
  int val;

  for(i=1; i<=4; i++) {
    runlen=StrRetRunlenDigit(s);
    if(runlen==0) {
      return(-1);
    } 
    if(s[0]=='0') {
      return(-1);
    } 
    val=atoi(s);
    if(val<0 || val>255) {
      return(-1);
    }  
    s+=runlen;
    if(i<4) {
      if(*s=='.') {
        s++;
      } else {
        return(-1); 
      }
    }  
  }
  return(0);
}

Damals unterschrieben mit der Bemerkung "for Helmut Schellong to optimize", was Helmut auch prompt erledigte. -- HelmutLeitner

Richtig, das war wohl bis jetzt der letzte Thread in der NG, der mir so richtig Spaß gemacht hatte - und solch einen Algo hatte ich bis dahin nicht in meinen Archiven.--hs


KategorieAlgorithmus KategorieOptimierung KategorieProgrammierBeispiele KategorieSchellong
StartSeite | HelmutSchellong/ | Neues | TestSeite | ForumSeite | Teilnehmer | Kategorien | Index | Hilfe | Einstellungen | Ändern
Text dieser Seite ändern (zuletzt geändert: 9. September 2003 3:46 (diff))
Suchbegriff: gesucht wird
im Titel
im Text