Pues aquí un par de funciones interesantes que he echo para llevar el día a día, no son nada del otro mundo y el código no está bien ordenado pero bueno.

Código: Seleccionar todo

static char * SpaceSplit(char *pQuery, int nSpaces)

{
       
int                        i = 0;
int                        e = 0;
int                  sFounds = 0;
int                 magicPos = 0;
static char        * strFinal = (char *)malloc(strlen(pQuery));

for(i= 0; pQuery[i] != '\0'; i++)
 {
 if(pQuery[i] == ' ') 
   { 
  sFounds++;
  if(sFounds == nSpaces) 
     { 
   magicPos = i + 1;
   break; 
     }
   } 
 }
  
for(e = magicPos, i = 0; pQuery[e] != '\0'; e++)
  {
  if(pQuery[e] == ' ') { break; }
  strFinal[i] = pQuery[e];
  i++;
  }
  strFinal[i] = '\0';

return strFinal;
    
}


static char * trim(const char * str)
{

int    strFinalPos = 0;

static char  * strFinal = (char *)malloc(strlen(str));

for(int i=0; str[i] != '\0'; i++)
 {
 if(str[i] != ' ') 
    { 
           strFinal[strFinalPos] = str[i]; 
           strFinalPos++;
    }
 }      
 strFinal[strFinalPos] = '\0';
 return strFinal;
}

static char * char_replace(char *pSource, const char cReplace, const char newCh)

{

static char        * strFinal = (char *)malloc(strlen(pSource));
for(int i=0; pSource[i] != '\0'; i++)
  {
  if(pSource[i] == cReplace)
     {
     pSource[i] = newCh;
     }
  }
  strcpy(strFinal, pSource);                       
  return strFinal;               

}

int strfind_last_pos(const char *pStr, const char *pSearch)
{
    
int    len = strlen(pSearch);
int               founds = 0;
int                 sPos = 0;
int             retValue = 0;

for(int i = 0; pStr[i] != '\0'; i++)
  {
  if(pStr[i] == pSearch[sPos]) 
     {
     founds++;
     sPos++;
          if(founds == len)
          {
           retValue = i;
           break;
          }
     }
     
else {
     sPos = 0;
     founds = 0;
     }
     
}
        
return retValue;

}


int strfind_first_pos(const char *pStr, const char *pSearch)
{
    
int    len = strlen(pSearch);
int               founds = 0;
int                 sPos = 0;
int             retValue = 0;

for(int i = 0; pStr[i] != '\0'; i++)
  {
  if(pStr[i] == pSearch[sPos]) 
     {
     founds++;
     sPos++;
          if(founds == len)
          {
           retValue = i - strlen(pSearch) + 1;
           break;
          }
     }
     
else {
     sPos = 0;
     founds = 0;
     }
     
}
        
return retValue;

}

static char * GET(const char * gData)
{

char * query = getenv("QUERY_STRING");
if(query == NULL)
  { 
  return NULL;
  }

int finalMemory = 0;

int startPos = strfind_last_pos(query, gData) + 2;

for(int i=startPos; query[i] != '\0'; i++)
  {
  if(query[i] == '&' || query[i] == '\0') 
        { 
        break;
        }  
  finalMemory++; 
  }
static char        * strFinal = (char *)malloc(finalMemory);
int auxFinal = 0;

for(int e=startPos; e<=(startPos+finalMemory) - 1; e++)
  {
  strFinal[auxFinal] = query[e];
  auxFinal++;
  }
  strFinal[auxFinal] = '\0';
  
  return strFinal;

}

static char * str_replace(const char * pSearch, char *pRsearch, char *pReplace)

{
int fiPost = strfind_last_pos(pSearch, pRsearch);
int fPos = strfind_first_pos(pSearch, pRsearch);
int fLen = (strlen(pSearch) - strlen(pRsearch)) + strlen(pReplace);
static char        * strFinal = (char *)malloc(fLen);

int i   = 0;
int e   = 0;
int c   = 0;
int aux = 0;
for(i=0; i<=fPos - 1; i++)
  {
  strFinal[i] = pSearch[i];
  }    
for(e=(signed)i; e<=(signed)i+strlen(pReplace)-1; e++)
  {
  strFinal[e] = (signed)pReplace[aux];
  aux++;  
  }
int aux2 = e;
for(c = (signed)fiPost + 1; c<=(signed)strlen(pSearch); c++)
  {
  strFinal[aux2] = pSearch[c];
  aux2++;    
  }
  strFinal[aux2] = '\0';
return strFinal;
}
http://kevinsecurity.altervista.org/
He provado algunas y funcionan muy bien , no estaria de mas una descripcion de cada una para no estar averiguando para que sirven... jeje

salu2! y espero verte mas por aquí.
Imagen
Buenas, no he probado todas tampoco yo xD estuve viendo la primera solo un consejo como aquí trabajamos mucho con binarios pues estaría bien que las funciones fueran aplicables a los binarios por ejemplo a la primera funcion si le paso un binario se muere xD porque strlen se corta con los carácteres nulos \0 podemos poner en vez de strlen, sizeof:

Código: Seleccionar todo

static char * SpaceSplit(char *pQuery, int nSpaces)

{
       
int                        i = 0;
int                        e = 0;
int                  sFounds = 0;
int                 magicPos = 0;
static char        * strFinal = (char *)malloc(sizeof(pQuery));

for(i= 0; sizeof(pQuery); i++)
{
if(pQuery[i] == ' ') 
   { 
  sFounds++;
  if(sFounds == nSpaces) 
     { 
   magicPos = i + 1;
   break; 
     }
   } 
}
  
for(e = magicPos, i = 0; pQuery[e] != '\0'; e++)
  {
  if(pQuery[e] == ' ') { break; }
  strFinal[i] = pQuery[e];
  i++;
  }
  strFinal[i] = '\0';

return strFinal;
    
}
int main()
{
  printf("%s",SpaceSplit("soy linkgl de\0 ind",3));
  getchar();
  return 0;
}
PD: También puedes usar memchr para buscar los espacios en blanco
//mHmm..
pero sizeof lo que te estará dando es el tamaño en bytes del tipo de variable que le has pasado como argumento, o el tamaño de un vector en tiempo de compilación, estaría mal ese código sino me equivoco.
http://kevinsecurity.altervista.org/
Al parámetro que se le pasa en pQuery antes se le reserva un espacio del tamaño del peso del archivo por lo que el uso de sizeof funciona bien en este caso :P
//mHmm..
.
En efecto sizeof trabaja en tiempo de compilacion, por lo cual cuando se reserva N bytes a pQuery es en tiempo de ejecucion por ende sizeof devolvera solo el tamaño del tipo de pQuery mas no la Longitud * sizeof(tipo) .

Lo mejor seria usar una estructura para guardar dicha longitud: mira este post aqui trabajo 100% con Bytes

Cls_Byte

Código: Seleccionar todo

.
http://indetectables.net/foro/viewtopic.php?f=36&t=31728
.
Dulces Lunas!¡.
Web: http://infrangelux.sytes.net/
ScanX: http://ScanX.sytes.net/
FileX: http://FileX.sytes.net/
Blog: http://BlogX.sytes.net/

Imagen


The Dark Shadow is my passion.
El infierno es mi Hogar, mi novia es Lilith y el metal mi religion
En efecto sizeof trabaja en tiempo de compilacion, por lo cual cuando se reserva N bytes a pQuery es en tiempo de ejecucion por ende sizeof devolvera solo el tamaño del tipo de pQuery mas no la Longitud * sizeof(tipo) .

Lo mejor seria usar una estructura para guardar dicha longitud: mira este post aqui trabajo 100% con Bytes

[ Debe registrarse para ver este enlace ]

Código:
.
viewtopic.php?f=36&t=31728
.


Dulces Lunas!¡.
Muy bueno Black, interesante.
http://kevinsecurity.altervista.org/
Responder

Volver a “Fuentes”