//adds the second string to the first string and stores it in dest int Strconcat( char *dest, const char *first, const char *second ) { char *tempDest = dest; int len; len = Strcopy( tempDest, first ); for( int i=0; i<len; i++) tempDest++; return len + Strcopy( tempDest, second ); }
Str Strdup(Str s) { Str n = Strnew_size(s->length); STR_LENGTH_CHECK(s); Strcopy(n, s); return n; }
Str Stralign_left(Str s, int width) { Str n; int i; STR_LENGTH_CHECK(s); if (s->length >= width) return Strdup(s); n = Strnew_size(width); Strcopy(n, s); for (i = s->length; i < width; i++) Strcat_char(n, ' '); return n; }
/*------------------------------------------------------------------ * parse command line for options *------------------------------------------------------------------*/ static void GetOptions( int *argc, char *argv[], Info *info ) { int oHelp; char *oBrack; char *oTabs; char *oCtype; char *oHtype; char *oSort; char *oFile; char *oSpace; char *oKeys; char *oBreak; char *oTemp; char *oImbed; char *oDuplex; char *oXlate; char *numLeft; char *s1; char *s2; char *oWrap; char *oRepHdr; /*--------------------------------------------------------------- * parse arguments *---------------------------------------------------------------*/ parsearg(argc,argv,0,PROGRAM_ENVV,"-", Strcopy("? b@ c@ d@ h@ k@ i@ n@ o@ p@ r@ s@ t@ w@ x@ y@"), &oHelp,&oBrack,&oCtype,&oDuplex,&oHtype,&oKeys,&oImbed, &oSpace,&oFile,&oBreak,&oRepHdr,&oSort,&oTabs,&oWrap, &oXlate,&oTemp); /*--------------------------------------------------------------- * check parms *---------------------------------------------------------------*/ if (oHelp || (*argc < 2)) Usage(); if ('?' == *argv[1]) Usage(); /*--------------------------------------------------------------- * apply option defaults *---------------------------------------------------------------*/ if ((NULL == oBrack ) || ('\0' == *oBrack )) oBrack = "+"; if ((NULL == oCtype ) || ('\0' == *oCtype )) oCtype = "c"; if ((NULL == oDuplex) || ('\0' == *oDuplex)) oDuplex = "-"; if ((NULL == oHtype ) || ('\0' == *oHtype )) oHtype = "h"; if ((NULL == oKeys ) || ('\0' == *oKeys )) oKeys = ""; if ((NULL == oImbed ) || ('\0' == *oImbed )) oImbed = ""; if ((NULL == oSpace ) || ('\0' == *oSpace )) oSpace = "2"; if ((NULL == oFile ) || ('\0' == *oFile )) oFile = NULL; if ((NULL == oBreak ) || ('\0' == *oBreak )) oBreak = "+"; if ((NULL == oRepHdr) || ('\0' == *oRepHdr)) oRepHdr = ""; if ((NULL == oSort ) || ('\0' == *oSort )) oSort = "tn"; if ((NULL == oTabs ) || ('\0' == *oTabs )) oTabs = "4"; if ((NULL == oWrap ) || ('\0' == *oWrap )) oWrap = ""; if ((NULL == oXlate ) || ('\0' == *oXlate )) oXlate = Strcopy("0,0"); if ((NULL == oTemp ) || ('\0' == *oTemp )) oTemp = ""; /*--------------------------------------------------------------- * bracketing option *---------------------------------------------------------------*/ info->oBrack = (int) strtol(oBrack,NULL,10); if (0 == info->oBrack) { if ((1 != strlen(oBrack)) || (NULL == strchr("-+",*oBrack))) cPostError(1,"invalid value on -b option"); if ('+' == *oBrack) info->oBrack = 1000; else info->oBrack = 0; } /*--------------------------------------------------------------- * extensions for C files *---------------------------------------------------------------*/ info->oCtype = oCtype; /*--------------------------------------------------------------- * duplex *---------------------------------------------------------------*/ if ((1 != strlen(oDuplex)) || (NULL == strchr("-+",*oDuplex))) cPostError(1,"invalid value on -d option"); info->oDuplex = ('+' == *oDuplex); /*--------------------------------------------------------------- * extensions for H files *---------------------------------------------------------------*/ info->oHtype = oHtype; /*--------------------------------------------------------------- * reserved words *---------------------------------------------------------------*/ InitializeReservedHash(info,oKeys); /*--------------------------------------------------------------- * imbed option *---------------------------------------------------------------*/ info->oImbed = oImbed; /*--------------------------------------------------------------- * space option *---------------------------------------------------------------*/ info->oSpace = (int) strtol(oSpace,&numLeft,10); if (*numLeft || (info->oSpace < 0)) cPostError(1,"invalid value on -n option"); /*--------------------------------------------------------------- * output file option *---------------------------------------------------------------*/ if (NULL == oFile) info->oFile = stdout; else { info->oFile = fopen(oFile,"w"); if (NULL == info->oFile) cPostError(1,"error opening output file %s for writing",oFile); } /*--------------------------------------------------------------- * page break option *---------------------------------------------------------------*/ if ((1 != strlen(oBreak)) || (NULL == strchr("-+",*oBreak))) cPostError(1,"invalid value on -p option"); info->oBreak = ('+' == *oBreak); /*--------------------------------------------------------------- * replace PS header *---------------------------------------------------------------*/ info->oRepHdr = oRepHdr; /*--------------------------------------------------------------- * sort option *---------------------------------------------------------------*/ if ((0 != Stricmp("nt",oSort)) && (0 != Stricmp("tn",oSort))) cPostError(1,"invalid value on -s option"); info->oSort = Strupr(oSort); /*--------------------------------------------------------------- * tabs option *---------------------------------------------------------------*/ info->oTabs = (int) strtol(oTabs,NULL,10); if (0 == info->oTabs) cPostError(1,"invalid value on -t option"); /*--------------------------------------------------------------- * wrap PS around output *---------------------------------------------------------------*/ info->oWrapB = strtok(oWrap,";"); info->oWrapA = strtok(NULL,""); /*--------------------------------------------------------------- * translate option *---------------------------------------------------------------*/ s1 = strtok(oXlate,","); s2 = strtok(NULL,""); if (!s1 || !s2) cPostError(1,"invalid value on -x option"); info->oXlateX = (int) strtol(s1,NULL,10); info->oXlateY = (int) strtol(s2,NULL,10); /*--------------------------------------------------------------- * temp path *---------------------------------------------------------------*/ if (!strlen(oTemp)) info->oTemp = ""; else { char c; c = oTemp[strlen(oTemp) - 1]; if (('\\' == c) || ('/' == c)) info->oTemp = oTemp; else { info->oTemp = malloc(2+strlen(oTemp)); strcpy(info->oTemp,oTemp); strcat(info->oTemp,"/"); } } }
int Insert_Row(Table *Wh , char *rData) { Row *pre = Wh -> tail; Row *p = NULL; if (Wh -> head == NULL) p = Wh -> head = (Row *)malloc(sizeof(Row)); else p = Wh -> tail -> next = (Row *)malloc(sizeof(Row));; Wh -> tail = p; if (Wh -> tail == NULL) { NoSpace(); return -1; } p -> next = NULL; p -> info = (void **)malloc(Wh -> NoC * sizeof(void *)); //指针数组 用来储存每一行的数据 if (p -> info == NULL) { NoSpace(); return -1; } for (int i = 0 ; i < Wh -> NoC ; i ++) { if (Wh -> types[i] == FLOAT) p -> info[i] = (void *)malloc(sizeof(double)); else p -> info[i] = (void *)malloc(Wh ->types[i] * sizeof(char)); if (p -> info[i] == NULL) { NoSpace(); return -1; } } p -> select = 0; char *tmp = (char *)malloc(MAXLEN * sizeof(char)); if (tmp == NULL) { NoSpace(); return -1; } char *tmp_bac = tmp; int index = 0; for ( ; *rData != '\0' ; rData ++) //每碰到一个逗号就处理这个区间的数据 { if (*rData == ',' || *rData == '\n') { *tmp = '\0'; if (*tmp_bac == '\0' && Wh -> null[index] == NOT_NULL) //如果该列值为空 但是建表时要求不能为空 则error { if (pre == NULL) Wh -> head = NULL; else Wh -> tail = pre; printf("---The column '%s' can not be empty.---\n" , Wh -> names[index]); return -1; } if (Wh -> types[index] == 0) *((double *)(p -> info[index])) = atof(tmp_bac); else Strcopy((char *)(p -> info[index]) , tmp_bac); index ++; tmp = tmp_bac; } else *(tmp ++) = *rData; } return 0; }