SSCANF in 14Zeilen?

Wichtiger Hinweis: Bitte ändert nicht manuell die Schriftfarbe auf schwarz sondern belasst es bei der Standardeinstellung. Somit tragt ihr dazu bei dass euer Text auch bei Verwendung unseren dunklen Forenstils noch lesbar ist!

Tipp: Ihr wollt längere Codeausschnitte oder Logfiles bereitstellen? Benutzt unseren eigenen PasteBin-Dienst Link
  • Guten Tag, hier ist mal SSCANF in 14Zeilen davor waren es halt 49Zeilen (komprimiert) doch meine Frage/Anliegen/Problem what ever ist: Funktioniert es so genau wie vorher und ist es so nicht eig. Resourcensparender das Script hat komischer weise nun einen geringeren Speicherverbrauch?


    stock sscanf(string[],format[],{Float,_}:...){if(string[0]==0||(string[0]==1&&string[1]==0)){return format[0];}new formatPos=0,stringPos=0,paramPos=2,paramCount=numargs(),delim=' ';while(string[stringPos]&&string[stringPos]<=' '){stringPos++;}while(paramPos<paramCount&&string[stringPos]){switch(format[formatPos++]){case'\0':{return 0;}case'i','d':{new neg=1,num=0,ch=string[stringPos];if(ch=='-'){neg=-1;ch=string[++stringPos];}do{stringPos++;if('0'<=ch<='9'){num=(num * 10) + (ch - '0');}else{return -1;}}
    while((ch=string[stringPos])>' '&&ch!=delim);setarg(paramPos,0,num * neg);}case'h','x':{new num=0,ch=string[stringPos];do{stringPos++;switch(ch){case'x','X':{num=0;continue;}case'0' .. '9':{num=(num << 4) | (ch - '0');}case'a' .. 'f':{num=(num << 4) | (ch - ('a' - 10));}case'A' .. 'F':{num=(num << 4) | (ch - ('A' - 10));}default:{return -1;}}}while((ch=string[stringPos])>' '&&ch!=delim);setarg(paramPos,0,num);}case'c':{setarg(paramPos,0,string[stringPos++]);}
    case'f':{new changestr[16],changepos=0,strpos=stringPos;while(changepos<16&&string[strpos]&&string[strpos]!=delim){changestr[changepos++]=string[strpos++];}changestr[changepos]='\0';setarg(paramPos,0,_:floatstr(changestr));}case'p':{delim=format[formatPos++];continue;}case'\'':{new end=formatPos - 1,ch;while((ch=format[++end])&&ch!='\'') {}if(!ch){return -1;}format[end]='\0';if((ch=strfind(string,format[formatPos],false,stringPos))==-1){if(format[end + 1]){
    return -1;}return 0;}format[end]='\'';stringPos=ch + (end - formatPos);formatPos=end + 1;}case'u':{new end=stringPos - 1,id=0,bool:num=true,ch;while((ch=string[++end])&&ch!=delim){if(num){if('0'<=ch<='9'){id=(id*10)+(ch-'0');}else{num=false;}}}if(num&&IsPlayerConnected(id)){setarg(paramPos,0,id);}else{
    #if!defined foreach
    #define foreach(%1,%2) for (new %2=0; %2<MAX_PLAYERS; %2++) if(IsPlayerConnected(%2))
    #define __SSCANF_FOREACH__
    #endif
    string[end]='\0';num=false;new name[MAX_PLAYER_NAME];id=end - stringPos;foreach (Player,playerid){GetPlayerName(playerid,name,sizeof (name));if(!strcmp(name,string[stringPos],true,id)){setarg(paramPos,0,playerid);num=true;break;}}if(!num){setarg(paramPos,0,INVALID_PLAYER_ID);}string[end]=ch;
    #if defined __SSCANF_FOREACH__
    //#undef foreach
    //#undef __SSCANF_FOREACH__
    #endif
    }stringPos=end;}case's','z':{new i=0,ch;if(format[formatPos]){while((ch=string[stringPos++])&&ch!=delim){setarg(paramPos,i++,ch);}if(!i){return -1;}}else{while((ch=string[stringPos++])){setarg(paramPos,i++,ch);}}stringPos--;setarg(paramPos,i,'\0');}default:{continue;}}while(string[stringPos]&&string[stringPos]!=delim&&string[stringPos]>' '){stringPos++;}while(string[stringPos]&&(string[stringPos]==delim||string[stringPos]<=' ')){stringPos++;}paramPos++;}do
    {if((delim=format[formatPos++])>' '){if(delim=='\''){while((delim=format[formatPos++])&&delim!='\'') {}}else if(delim!='z'){return delim;}}}while(delim>' ');return 0;}

    Why do programmers always mix up Halloween and Christmas?
    Oct 31 == Dec 25

  • Würde mich auch mal interessieren.
    Wenn das funktionieren würde könnte man einige Scripter vieeeeeeel einfacher und kürzer gestalten!



    MfG Firer
    //EDIT: Gerade mal getestet
    Mann braucht nur "#pragma tabsize 0", scheint aber zu funzen.

    Einmal editiert, zuletzt von Firerfan ()

  • Meine Commands laufen bereits meistens komprimiert ab.
    Ingame sehe ich auch keine Fehler.. nur ich würde gerne wissen ob das eig. auch irgendetwas außer unübersichtlichkeit und kürzeres Script was bringt?


    Achja ich weiß FireFan hab immer im Script die Tabsize 0 sonst würd das nicht funktionieren =D

    Why do programmers always mix up Halloween and Christmas?
    Oct 31 == Dec 25

  • Naja nur weil es kürzer ist heißt es nicht automatisch, dass es weniger Ressourcen zieht. Wenn du keine Sachen umgeändert hast sollte es natürlich funktionieren.


    Beispiel zum Sparen von Zeilen:
    if(x)
    {
    xyz;
    }
    else
    {
    xya;
    return 1;
    }
    Wird zu
    if(!x) return xya;
    xyz;
    Ersparnis von 7 (von 9) Zeilen. Ob es wirklich Ressourcen spart zweifle ich mal stark an...