Commit 6c849321 authored by Yang Tse's avatar Yang Tse
Browse files

curl tool: reviewed code moved to tool_*.[ch] files

parent 0f19e014
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -8,7 +8,7 @@ UID 0x00000000 0xF0206442

SOURCEPATH  ../../../src
SOURCE \
    hugehelp.c urlglob.c writeout.c writeenv.c \
    hugehelp.c writeout.c writeenv.c \
    getpass.c homedir.c curlutil.c xattr.c \
    tool_binmode.c \
    tool_bname.c \
@@ -39,6 +39,7 @@ SOURCE \
    tool_parsecfg.c \
    tool_setopt.c \
    tool_sleep.c \
    tool_urlglob.c \
    tool_vms.c

SOURCEPATH  ../../../lib
+4 −2
Original line number Diff line number Diff line
@@ -14,7 +14,7 @@ CURLX_ONES = $(top_srcdir)/lib/strtoofft.c \
	$(top_srcdir)/lib/rawstr.c \
	$(top_srcdir)/lib/nonblock.c

CURL_CFILES = hugehelp.c urlglob.c writeout.c writeenv.c \
CURL_CFILES = hugehelp.c writeout.c writeenv.c \
	getpass.c homedir.c curlutil.c xattr.c \
	tool_binmode.c \
	tool_bname.c \
@@ -45,10 +45,11 @@ CURL_CFILES = hugehelp.c urlglob.c writeout.c writeenv.c \
	tool_parsecfg.c \
	tool_setopt.c \
	tool_sleep.c \
	tool_urlglob.c \
	tool_vms.c

CURL_HFILES = hugehelp.h setup.h config-win32.h config-mac.h \
	config-riscos.h urlglob.h version.h xattr.h \
	config-riscos.h version.h xattr.h \
	writeout.h writeenv.h getpass.h homedir.h curlutil.h \
	tool_binmode.h \
	tool_bname.h \
@@ -80,6 +81,7 @@ CURL_HFILES = hugehelp.h setup.h config-win32.h config-mac.h \
	tool_sdecls.h \
	tool_setopt.h \
	tool_sleep.h \
	tool_urlglob.h \
	tool_vms.h

curl_SOURCES = $(CURL_CFILES) $(CURLX_ONES) $(CURL_HFILES)
+6 −6
Original line number Diff line number Diff line
@@ -169,8 +169,8 @@ RELEASE_OBJS= \
	tool_parsecfgr.obj \
	tool_setoptr.obj \
	tool_sleepr.obj \
	tool_urlglobr.obj \
	tool_vmsr.obj \
	urlglobr.obj \
	writeoutr.obj \
	xattrr.obj \
	curlr.res
@@ -212,8 +212,8 @@ DEBUG_OBJS= \
	tool_parsecfgd.obj \
	tool_setoptd.obj \
	tool_sleepd.obj \
	tool_urlglobd.obj \
	tool_vmsd.obj \
	urlglobd.obj \
	writeoutd.obj \
	xattrd.obj \
	curld.res
@@ -342,8 +342,6 @@ hugehelpr.obj: hugehelp.c
	$(CCR) $(CFLAGS) /Zm200 /Fo"$@" hugehelp.c
writeoutr.obj: writeout.c
	$(CCR) $(CFLAGS) /Fo"$@" writeout.c
urlglobr.obj: urlglob.c
	$(CCR) $(CFLAGS) /Fo"$@" urlglob.c
getpassr.obj: getpass.c
	$(CCR) $(CFLAGS) /Fo"$@" getpass.c
homedirr.obj: homedir.c
@@ -414,6 +412,8 @@ tool_setoptr.obj: tool_setopt.c
	$(CCR) $(CFLAGS) /Fo"$@" tool_setopt.c
tool_sleepr.obj: tool_sleep.c
	$(CCR) $(CFLAGS) /Fo"$@" tool_sleep.c
tool_urlglobr.obj: tool_urlglob.c
	$(CCR) $(CFLAGS) /Fo"$@" tool_urlglob.c
tool_vmsr.obj: tool_vms.c
	$(CCR) $(CFLAGS) /Fo"$@" tool_vms.c
xattrr.obj: xattr.c
@@ -426,8 +426,6 @@ hugehelpd.obj: hugehelp.c
	$(CCD) $(CFLAGS) /Zm200 /Fo"$@" hugehelp.c
writeoutd.obj: writeout.c
	$(CCD) $(CFLAGS) /Fo"$@" writeout.c
urlglobd.obj: urlglob.c
	$(CCD) $(CFLAGS) /Fo"$@" urlglob.c
getpassd.obj: getpass.c
	$(CCD) $(CFLAGS) /Fo"$@" getpass.c
homedird.obj: homedir.c
@@ -498,6 +496,8 @@ tool_setoptd.obj: tool_setopt.c
	$(CCD) $(CFLAGS) /Fo"$@" tool_setopt.c
tool_sleepd.obj: tool_sleep.c
	$(CCD) $(CFLAGS) /Fo"$@" tool_sleep.c
tool_urlglobd.obj: tool_urlglob.c
	$(CCD) $(CFLAGS) /Fo"$@" tool_urlglob.c
tool_vmsd.obj: tool_vms.c
	$(CCD) $(CFLAGS) /Fo"$@" tool_vms.c
xattrd.obj: xattr.c
+1 −1
Original line number Diff line number Diff line
@@ -49,7 +49,6 @@

#include "curlutil.h"
#include "homedir.h"
#include "urlglob.h"
#include "writeout.h"
#include "xattr.h"

@@ -79,6 +78,7 @@
#include "tool_parsecfg.h"
#include "tool_setopt.h"
#include "tool_sleep.h"
#include "tool_urlglob.h"

#include "memdebug.h" /* keep this as LAST include */

+91 −64
Original line number Diff line number Diff line
@@ -26,13 +26,14 @@
#define _MPRINTF_REPLACE /* we want curl-functions instead of native ones */
#include <curl/mprintf.h>

#include "urlglob.h"
#include "tool_urlglob.h"
#include "tool_vms.h"

#include "memdebug.h" /* keep this as LAST include */

typedef enum {
  GLOB_OK,
  GLOB_NO_MEM,
  GLOB_ERROR
} GlobCode;

@@ -53,11 +54,12 @@ static GlobCode glob_set(URLGlob *glob, char *pattern,
  /* processes a set expression with the point behind the opening '{'
     ','-separated elements are collected until the next closing '}'
  */
  URLPattern *pat;
  GlobCode res;
  bool done = FALSE;
  char* buf = glob->glob_buffer;
  URLPattern *pat;

  pat = (URLPattern*)&glob->pattern[glob->size / 2];
  pat = &glob->pattern[glob->size / 2];
  /* patterns 0,1,2,... correspond to size=1,3,5,... */
  pat->type = UPTSet;
  pat->content.Set.size = 0;
@@ -98,8 +100,8 @@ static GlobCode glob_set(URLGlob *glob, char *pattern,
      else
        pat->content.Set.elements = malloc(sizeof(char*));
      if(!pat->content.Set.elements) {
        snprintf(glob->errormsg, sizeof(glob->errormsg), "out of memory");
        return GLOB_ERROR;
        snprintf(glob->errormsg, sizeof(glob->errormsg), "out of memory\n");
        return GLOB_NO_MEM;
      }
      pat->content.Set.elements[pat->content.Set.size] =
        strdup(glob->glob_buffer);
@@ -110,8 +112,8 @@ static GlobCode glob_set(URLGlob *glob, char *pattern,
        Curl_safefree(pat->content.Set.elements);
        pat->content.Set.ptr_s = 0;
        pat->content.Set.size = 0;
        snprintf(glob->errormsg, sizeof(glob->errormsg), "out of memory");
        return GLOB_ERROR;
        snprintf(glob->errormsg, sizeof(glob->errormsg), "out of memory\n");
        return GLOB_NO_MEM;
      }
      ++pat->content.Set.size;

@@ -120,8 +122,17 @@ static GlobCode glob_set(URLGlob *glob, char *pattern,
        int wordamount;

        /* always check for a literal (may be "") between patterns */
        if(GLOB_ERROR == glob_word(glob, ++pattern, ++pos, &wordamount))
          return GLOB_ERROR;
        res = glob_word(glob, ++pattern, ++pos, &wordamount);
        if(res) {
          short elem;
          for(elem = 0; elem < pat->content.Set.size; elem++)
            Curl_safefree(pat->content.Set.elements[elem]);
          Curl_safefree(pat->content.Set.elements);
          pat->content.Set.ptr_s = 0;
          pat->content.Set.size = 0;
          return res;
        }

        *amount = pat->content.Set.size * wordamount;

        done = TRUE;
@@ -163,22 +174,26 @@ static GlobCode glob_range(URLGlob *glob, char *pattern,
  */
  URLPattern *pat;
  char *c;
  int wordamount=1;
  char sep;
  char sep2;
  int step;
  int rc;
  GlobCode res;
  int wordamount = 1;

  pat = (URLPattern*)&glob->pattern[glob->size / 2];
  pat = &glob->pattern[glob->size / 2];
  /* patterns 0,1,2,... correspond to size=1,3,5,... */
  ++glob->size;

  if(ISALPHA(*pattern)) {         /* character range detected */
  if(ISALPHA(*pattern)) {
    /* character range detected */
    char min_c;
    char max_c;

    pat->type = UPTCharRange;

    rc = sscanf(pattern, "%c-%c%c%d%c", &min_c, &max_c, &sep, &step, &sep2);

    if((rc < 3) || (min_c >= max_c) || ((max_c - min_c) > ('z' - 'a'))) {
      /* the pattern is not well-formed */
      snprintf(glob->errormsg, sizeof(glob->errormsg),
@@ -201,7 +216,8 @@ static GlobCode glob_range(URLGlob *glob, char *pattern,
    pat->content.CharRange.ptr_c = pat->content.CharRange.min_c = min_c;
    pat->content.CharRange.max_c = max_c;
  }
  else if(ISDIGIT(*pattern)) { /* numeric range detected */
  else if(ISDIGIT(*pattern)) {
    /* numeric range detected */
    int min_n;
    int max_n;

@@ -223,7 +239,8 @@ static GlobCode glob_range(URLGlob *glob, char *pattern,
    pat->content.NumRange.step =
      ((sep == ':') && (rc == 5) && (sep2 == ']')) ? step : 1;

    if(*pattern == '0') {              /* leading zero specified */
    if(*pattern == '0') {
      /* leading zero specified */
      c = pattern;
      while(ISDIGIT(*c)) {
        c++;
@@ -231,7 +248,6 @@ static GlobCode glob_range(URLGlob *glob, char *pattern,
                                              instances of this pattern */
      }
    }

  }
  else {
    snprintf(glob->errormsg, sizeof(glob->errormsg),
@@ -249,18 +265,22 @@ static GlobCode glob_range(URLGlob *glob, char *pattern,

  /* always check for a literal (may be "") between patterns */

  if(GLOB_ERROR == glob_word(glob, c, pos + (c - pattern), &wordamount))
  res = glob_word(glob, c, pos + (c - pattern), &wordamount);
  if(res == GLOB_ERROR) {
    wordamount = 1;
    res = GLOB_OK;
  }

  if(!res) {
    if(pat->type == UPTCharRange)
    *amount = (pat->content.CharRange.max_c -
               pat->content.CharRange.min_c + 1) *
      wordamount;
      *amount = wordamount * (pat->content.CharRange.max_c -
                              pat->content.CharRange.min_c + 1);
    else
    *amount = (pat->content.NumRange.max_n -
               pat->content.NumRange.min_n + 1) * wordamount;
      *amount = wordamount * (pat->content.NumRange.max_n -
                              pat->content.NumRange.min_n + 1);
  }

  return GLOB_OK;
  return res; /* GLOB_OK or GLOB_NO_MEM */
}

static GlobCode glob_word(URLGlob *glob, char *pattern,
@@ -298,13 +318,16 @@ static GlobCode glob_word(URLGlob *glob, char *pattern,
  litindex = glob->size / 2;
  /* literals 0,1,2,... correspond to size=0,2,4,... */
  glob->literal[litindex] = strdup(glob->glob_buffer);
  if(!glob->literal[litindex])
    return GLOB_ERROR;
  if(!glob->literal[litindex]) {
    snprintf(glob->errormsg, sizeof(glob->errormsg), "out of memory\n");
    return GLOB_NO_MEM;
  }
  ++glob->size;

  switch (*pattern) {
  case '\0':
    break;                      /* singular URL processed  */
    /* singular URL processed  */
    break;

  case '{':
    /* process set pattern */
@@ -317,11 +340,10 @@ static GlobCode glob_word(URLGlob *glob, char *pattern,
    break;
  }

  if(GLOB_OK != res)
    /* free that strdup'ed string again */
  if(res)
    Curl_safefree(glob->literal[litindex]);

  return res; /* something got wrong */
  return res;
}

int glob_url(URLGlob** glob, char* url, int *urlnum, FILE *error)
@@ -332,14 +354,17 @@ int glob_url(URLGlob** glob, char* url, int *urlnum, FILE *error)
   */
  URLGlob *glob_expand;
  int amount;
  char *glob_buffer = malloc(strlen(url)+1);
  char *glob_buffer;
  GlobCode res;

  *glob = NULL;
  if(NULL == glob_buffer)

  glob_buffer = malloc(strlen(url) + 1);
  if(!glob_buffer)
    return CURLE_OUT_OF_MEMORY;

  glob_expand = calloc(1, sizeof(URLGlob));
  if(NULL == glob_expand) {
  if(!glob_expand) {
    Curl_safefree(glob_buffer);
    return CURLE_OUT_OF_MEMORY;
  }
@@ -347,19 +372,22 @@ int glob_url(URLGlob** glob, char* url, int *urlnum, FILE *error)
  glob_expand->urllen = strlen(url);
  glob_expand->glob_buffer = glob_buffer;
  glob_expand->beenhere = 0;
  if(GLOB_OK == glob_word(glob_expand, url, 1, &amount))

  res = glob_word(glob_expand, url, 1, &amount);
  if(!res)
    *urlnum = amount;
  else {
    if(error && glob_expand->errormsg[0]) {
      /* send error description to the error-stream */
      fprintf(error, "curl: (%d) [globbing] %s",
              CURLE_URL_MALFORMAT, glob_expand->errormsg);
              (res == GLOB_NO_MEM) ? CURLE_OUT_OF_MEMORY : CURLE_URL_MALFORMAT,
              glob_expand->errormsg);
    }
    /* it failed, we cleanup */
    Curl_safefree(glob_buffer);
    Curl_safefree(glob_expand);
    *urlnum = 1;
    return CURLE_URL_MALFORMAT;
    return (res == GLOB_NO_MEM) ? CURLE_OUT_OF_MEMORY : CURLE_URL_MALFORMAT;
  }

  *glob = glob_expand;
@@ -381,7 +409,6 @@ void glob_cleanup(URLGlob* glob)
        for(elem = glob->pattern[i/2].content.Set.size - 1;
             elem >= 0;
             --elem) {
          if(glob->pattern[i/2].content.Set.elements[elem])
          Curl_safefree(glob->pattern[i/2].content.Set.elements[elem]);
        }
        Curl_safefree(glob->pattern[i/2].content.Set.elements);
@@ -394,13 +421,13 @@ void glob_cleanup(URLGlob* glob)

char *glob_next_url(URLGlob *glob)
{
  char *buf = glob->glob_buffer;
  URLPattern *pat;
  char *lit;
  size_t i;
  size_t j;
  size_t buflen = glob->urllen+1;
  size_t len;
  size_t buflen = glob->urllen + 1;
  char *buf = glob->glob_buffer;

  if(!glob->beenhere)
    glob->beenhere = 1;
@@ -409,7 +436,7 @@ char *glob_next_url(URLGlob *glob)

    /* implement a counter over the index ranges of all patterns,
       starting with the rightmost pattern */
    for(i = glob->size / 2 - 1; carry && i < glob->size; --i) {
    for(i = glob->size / 2 - 1; carry && (i < glob->size); --i) {
      carry = FALSE;
      pat = &glob->pattern[i];
      switch (pat->type) {
@@ -487,10 +514,10 @@ char *glob_match_url(char *filename, URLGlob *glob)
{
  char *target;
  size_t allocsize;
  size_t stringlen=0;
  char numbuf[18];
  char *appendthis = NULL;
  size_t appendlen = 0;
  size_t stringlen = 0;

  /* We cannot use the glob_buffer for storage here since the filename may
   * be longer than the URL we use. We allocate a good start size, then
@@ -499,7 +526,7 @@ char *glob_match_url(char *filename, URLGlob *glob)
  allocsize = strlen(filename) + 1; /* make it at least one byte to store the
                                       trailing zero */
  target = malloc(allocsize);
  if(NULL == target)
  if(!target)
    return NULL; /* major failure */

  while(*filename) {
@@ -507,7 +534,7 @@ char *glob_match_url(char *filename, URLGlob *glob)
      unsigned long i;
      char *ptr = filename;
      unsigned long num = strtoul(&filename[1], &filename, 10);
      i = num-1;
      i = num - 1UL;

      if(num && (i <= glob->size / 2)) {
        URLPattern pat = glob->pattern[i];
@@ -556,7 +583,7 @@ char *glob_match_url(char *filename, URLGlob *glob)
         at the end of this function outside the while() loop */
      allocsize = (appendlen + stringlen) * 2;
      newstr = realloc(target, allocsize + 1);
      if(NULL ==newstr) {
      if(!newstr) {
        Curl_safefree(target);
        return NULL;
      }
Loading