C语言 怎么写一个加强版的strtok_r函数

C语言 如何写一个加强版的strtok_r函数
如果分割符在 双引号中 就跳过这个分隔符不分割

比如 char[1024]="\"http://192.168.1.1a|b|c\" | \" 345\"| \"123\"";
分割符为|  一个分割后为:
"http://192.168.1.1";
" 345"| "123"";
------解决方案--------------------
分两次调用喽,一次分割符为", 另一次用|
------解决方案--------------------
仅供参考
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#include <locale.h>
#define MAXF 256    //每行最多列数
#define MAXC 2048   //每列最多字符数+1
#define MAXW 16000  //每行最多字符数
static int maxw[MAXF];//扫描一遍得出的每列最大宽度
int maxf[MAXF];//扫描一遍得出的每列属性:-1字符串(左对齐)
------解决方案--------------------
0纯数字(右对齐)
------解决方案--------------------
>0带小数点数字的最多小数位数(按小数点对齐)
char d[MAXF][MAXC];
char ln[MAXW];
static int s,i,n,L,k,cn,pc,w,rn,nn,cl,lcl,r,wed,dt,f,o1;
char c,*p,*pp;
FILE *fi,*fo;
char delims[256];
int delimsL;
char ag;
int agdelims2gap(int col,char c) {
    if ('a'==ag) {
        if (strchr(delims,c)) return 1;
        else return 0;
    } else {//'g'==ag
        if (col>=delimsL) col=delimsL-1;//后面各列使用指定列间隔字符列表中最后的那个字符
        if (c==0) return delims[col];//c为0时返回col列后面在指定列间隔字符列表中对应的间隔字符
        if (delims[col]==c) return 1;
        else return 0;
    }
}
char *strlrtrim_c2c(char *s) {//将s两头的' '或'\t'去掉,并将其中的delims字符','或指定列间隔字符集合中的字符替换为';'
    char *s1;

    while (1) {
        if (*s==' '
------解决方案--------------------
*s=='\t') s++;
        else break;//
    }
    s1=s;
    while (1) {
        if (*s==0) break;//
        if ('a'==ag) {
            if (strchr(delims,*s)) {*s=';';rn++;} //指定列间隔字符集合时,将集合中的字符替换为';'
        } else {//'g'==ag
            if (','==*s) {*s=';';rn++;} //指定列间隔字符列表时,仅将','替换为';'
        }
s++;
}
while (1) {
if (s1==s) break;
s--;
if (!(*s==' '
------解决方案--------------------
*s=='\t')) {
*(s+1)=0;
break;//
}
}
return s1;
}
int strflg(char *ss) {//-1字符串(左对齐)
------解决方案--------------------
0纯数字(右对齐)
------解决方案--------------------
>0带小数点数字的最多小数位数(按小数点对齐)
int isd;

isd=-1;
while (1) {
if (*ss==0) break;//
if (*ss=='.') {
isd=1;
} else if ('0'<=*ss && *ss<='9') {
if (isd<1) isd=0;
else isd++;
} else {
isd=-1;
break;
}
ss++;
}
return isd;
}
void outf(int cc) {//-1字符串(左对齐)
------解决方案--------------------
0纯数字(右对齐)
------解决方案--------------------
>0带小数点数字的最多小数位数(按小数点对齐)
if (o1) {
o1=0;
p=strlrtrim_c2c(d[cc]);
if (-1==maxf[cc])
fprintf(fo,"%-*s",maxw[cc],p);
else if (0==maxf[cc])
fprintf(fo,"%*s",maxw[cc],p);
else {
if (0==L) {
if (-1==strflg(p))
fprintf(fo,"%-*s",maxw[cc]+maxf[cc],p);
else
fprintf(fo,"%*s%s%*s",maxw[cc]-(strchr(p,'.')?strchr(p,'.')-p:strlen(p)),"",p,maxf[cc]-strflg(p),"");
} else {
fprintf(fo,"%*s%s%*s",maxw[cc]-(strchr(p,'.')?strchr(p,'.')-p:strlen(p)),"",p,maxf[cc]-strflg(p),"");
}
}
} else {
c=',';
if ('g'==ag) c=agdelims2gap(cc-1,0);
p=strlrtrim_c2c(d[cc]);
if (-1==maxf[cc])
fprintf(fo,"%c%-*s",c,maxw[cc],p);
else if (0==maxf[cc])
fprintf(fo,"%c%*s",c,maxw[cc],p);
else {
if (0==L) {
if (-1==strflg(p))
fprintf(fo,"%c%-*s",c,maxw[cc]+maxf[cc],p);
else
fprintf(fo,"%c%*s%s%*s",c,maxw[cc]-(strchr(p,'.')?strchr(p,'.')-p:strlen(p)),"",p,maxf[cc]-strflg(p),"");
} else {
fprintf(fo,"%c%*s%s%*s",c,maxw[cc]-(strchr(p,'.')?strchr(p,'.')-p:strlen(p)),"",p,maxf[cc]-strflg(p),"");
}
}
}
}
int main(int argc,char **argv) {
setlocale(LC_ALL,"chs");
if (argc>1 && 0==strcmp(argv[1],"/?")) goto USAGE;
strcpy(delims,",");
if (argc>=2) {
ag=argv[1][0];
if ('a'!=ag && 'g'!=ag) goto USAGE;