Skip to content

Instantly share code, notes, and snippets.

@shakkhar
Created August 26, 2012 21:22
Show Gist options
  • Save shakkhar/3483653 to your computer and use it in GitHub Desktop.
Save shakkhar/3483653 to your computer and use it in GitHub Desktop.
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct param {
const char *text;
int len;
} param;
param params[256];
int param_compare(const void* a, const void* b)
{
param *s1 = (param *)a;
param *s2 = (param *)b;
int n = s1->len > s2->len ? s2->len : s1->len;
return strncmp(s1->text, s2->text, n);
}
char *url_sort(const char *in)
{
const char *pc = in;
char c = *in;
const char *real_in = NULL;
int keys_count = 0;
char *out = (char *)malloc(1024);
if (!out)
return NULL;
while (c != '\n' && c != '\0') {
pc++;
if (c == '?') {
real_in = pc;
c = *pc;
break;
}
c = *pc;
}
if (!real_in)
return strcpy(out, in);
if (pc == in)
return NULL;
do {
params[keys_count].text = pc;
c = *pc;
while (c != '\n' && c != '\0' && c != '&')
c = *(++pc);
if (c == '&') {
pc++;
params[keys_count].len = pc - params[keys_count].text - 1;
params[++keys_count].text = pc;
continue;
}
params[keys_count].len = pc - params[keys_count].text;
keys_count++;
break;
} while (1);
int i;
char *o = out;
/*
for (i = 0; i < keys_count; i++) {
printf("%s", params[i].text);
printf("%d\n", params[i].len);
}
*/
qsort(params, keys_count, sizeof(param), param_compare);
memcpy(o, in, real_in - in + 1);
o += real_in - in;
for (i = 0; i < keys_count; i++) {
//printf("%s", params[i].text);
//printf("%d\n", params[i].len);
memcpy(o, params[i].text, params[i].len);
o += params[i].len;
*o++ = '&';
}
*(o - 1) = '\0';
return out;
}
int main(int argc, char** argv){
char buf[2048];
char* out;
while(fgets(buf,2048,stdin) != NULL){
//chopping off newlines
buf[strcspn(buf, "\n")] = '\0';
if (buf[0] == '\0')
continue;
out = url_sort(buf);
printf("%s\n", out);
free(out);
// printf("Orig: %s\nSort: %s\n\n",buf, out );
}
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment