2011-08-20 22:51 keltezéssel, Mike Frysinger írta:
> On Friday, August 19, 2011 03:50:38 Márton Miklós wrote:
>> I have tried to add data file, for Lattice LCMXO2-1200-CSBGA, but the
>> urjtag failed to load the neccessary data file at datect, altrough my
>> data files were correct.
>>
>> Then I have realized that partname (lcmxo2-1200-csbga132) is longer then
>> 20 byte, and this causes the problem.
>> Some parts in the data dir also have longer name than 20 character
>> (lattice/m4a3-256.192-fpbga256 for e.g.), so I should suppose to
>> increase the size of name field to 64 character for e.g.
> seems like this is a losing battle.  how about the following patch instead ?
> -mike
>
> --- src/tap/detect.c  (revision 1981)
> +++ src/tap/detect.c  (working copy)
> @@ -46,14 +46,9 @@
>   #include<urjtag/parse.h>
>   #include<urjtag/jtag.h>
>
> -struct id_record
> -{
> -    char name[20];
> -    char fullname[100];
> -};
> -
>   static int
> -find_record (char *filename, urj_tap_register_t *key, struct id_record *idr)
> +find_record (char *filename, urj_tap_register_t *key,
> +             char **id_name, char **id_fullname)
>   {
>       FILE *file;
>       urj_tap_register_t *tr;
> @@ -61,6 +56,10 @@ find_record (char *filename, urj_tap_reg
>       char *line = NULL;
>       size_t len;
>
> +    free (*id_name);
> +    free (*id_fullname);
> +    *id_name = *id_fullname = NULL;
> +
>       file = fopen (filename, FOPEN_R);
>       if (!file)
>       {
> @@ -137,12 +136,8 @@ find_record (char *filename, urj_tap_reg
>           if (*s)
>               *s++ = '\0';
>
> -        /* test field length */
> -        if (strlen (p)>= sizeof idr->name)
> -            continue;
> -
>           /* copy name */
> -        strcpy (idr->name, p);
> +        *id_name = strdup (p);
>
>           /* next field */
>           p = s;
> @@ -153,14 +148,14 @@ find_record (char *filename, urj_tap_reg
>
>           /* line is empty? */
>           if (!*p)
> +        {
> +            free (*id_name);
> +            *id_name = NULL;
>               continue;
> -
> -        /* test field length */
> -        if (strlen (p)>= sizeof idr->fullname)
> -            continue;
> +        }
>
>           /* copy fullname */
> -        strcpy (idr->fullname, p);
> +        *id_fullname = strdup (p);
>
>           r = 1;
>           break;
> @@ -275,7 +270,6 @@ urj_tap_detect_parts (urj_chain_t *chain
>           urj_part_t *part;
>           urj_tap_register_t *did = br;   /* detected id (length is 1 or 32) 
> */
>           urj_tap_register_t *key;
> -        struct id_record idr;
>           char *p;
>           urj_part_init_func_t part_init_func;
>
> @@ -322,8 +316,9 @@ urj_tap_detect_parts (urj_chain_t *chain
>   #ifdef ENABLE_BSDL
>           if (urj_bsdl_scan_files (chain, urj_tap_register_get_string (did),
>                                    URJ_BSDL_MODE_DETECT)<= 0)
> -        {
>   #endif
> +        {
> +            char *id_name = NULL, *id_fullname = NULL;
>
>               /* find JTAG declarations for a part with id */
>
> @@ -335,7 +330,7 @@ urj_tap_detect_parts (urj_chain_t *chain
>
>               key = urj_tap_register_alloc (11);
>               memcpy (key->data,&id->data[1], key->len);
> -            if (!find_record (data_path, key,&idr))
> +            if (!find_record (data_path, key,&id_name,&id_fullname))
>               {
>                   urj_log (URJ_LOG_LEVEL_NORMAL, "  %s (%s) (%s)\n",
>                            _("Unknown manufacturer!"),
> @@ -345,14 +340,14 @@ urj_tap_detect_parts (urj_chain_t *chain
>               }
>
>               urj_log (URJ_LOG_LEVEL_NORMAL, "  %12s: %s (0x%03"PRIX64")\n",
> -                     _("Manufacturer"), idr.fullname,
> +                     _("Manufacturer"), id_fullname,
>                        (urj_tap_register_get_value (key)<<  1) | 1);
>               urj_tap_register_free (key);
>
> -            if (strlen (idr.fullname)>  URJ_PART_MANUFACTURER_MAXLEN)
> +            if (strlen (id_fullname)>  URJ_PART_MANUFACTURER_MAXLEN)
>                   urj_warning (_("Manufacturer too long\n"));
>               manufacturer[0] = '\0';
> -            strncat_const (manufacturer, idr.fullname);
> +            strncat_const (manufacturer, id_fullname);
>
>               /* parts */
>               p = strrchr (data_path, '/');
> @@ -360,12 +355,12 @@ urj_tap_detect_parts (urj_chain_t *chain
>                   p[1] = '\0';
>               else
>                   data_path[0] = '\0';
> -            strncat_const (data_path, idr.name);
> +            strncat_const (data_path, id_name);
>               strncat_const (data_path, "/PARTS");
>
>               key = urj_tap_register_alloc (16);
>               memcpy (key->data,&id->data[12], key->len);
> -            if (!find_record (data_path, key,&idr))
> +            if (!find_record (data_path, key,&id_name,&id_fullname))
>               {
>                   urj_log (URJ_LOG_LEVEL_NORMAL, "  %s (%s) (%s)\n",
>                            _("Unknown part!"),
> @@ -375,14 +370,14 @@ urj_tap_detect_parts (urj_chain_t *chain
>               }
>
>               urj_log (URJ_LOG_LEVEL_NORMAL, _("  Part(%d):      %s 
> (0x%03"PRIX64")\n"),
> -                     chain->active_part, idr.fullname,
> +                     chain->active_part, id_fullname,
>                        urj_tap_register_get_value (key));
>               urj_tap_register_free (key);
>
> -            if (strlen (idr.fullname)>  URJ_PART_PART_MAXLEN)
> +            if (strlen (id_fullname)>  URJ_PART_PART_MAXLEN)
>                   urj_warning (_("Part too long\n"));
>               partname[0] ='\0';
> -            strncat_const (partname, idr.fullname);
> +            strncat_const (partname, id_fullname);
>
>               /* steppings */
>               p = strrchr (data_path, '/');
> @@ -390,12 +385,12 @@ urj_tap_detect_parts (urj_chain_t *chain
>                   p[1] = '\0';
>               else
>                   data_path[0] = '\0';
> -            strncat_const (data_path, idr.name);
> +            strncat_const (data_path, id_name);
>               strncat_const (data_path, "/STEPPINGS");
>
>               key = urj_tap_register_alloc (4);
>               memcpy (key->data,&id->data[28], key->len);
> -            if (!find_record (data_path, key,&idr))
> +            if (!find_record (data_path, key,&id_name,&id_fullname))
>               {
>                   urj_log (URJ_LOG_LEVEL_NORMAL, "  %s (%s) (%s)\n",
>                            _("Unknown stepping!"),
> @@ -406,11 +401,11 @@ urj_tap_detect_parts (urj_chain_t *chain
>               urj_tap_register_free (key);
>
>               urj_log (URJ_LOG_LEVEL_NORMAL, _("  Stepping:     %s\n"),
> -                     idr.fullname);
> -            if (strlen (idr.fullname)>  URJ_PART_STEPPING_MAXLEN)
> +                     id_fullname);
> +            if (strlen (id_fullname)>  URJ_PART_STEPPING_MAXLEN)
>                   urj_warning (_("Stepping too long\n"));
>               stepping[0] = '\0';
> -            strncat_const (stepping, idr.fullname);
> +            strncat_const (stepping, id_fullname);
>
>               /* part definition file */
>               p = strrchr (data_path, '/');
> @@ -418,7 +413,7 @@ urj_tap_detect_parts (urj_chain_t *chain
>                   p[1] = '\0';
>               else
>                   data_path[0] = '\0';
> -            strncat_const (data_path, idr.name);
> +            strncat_const (data_path, id_name);
>
>               urj_log (URJ_LOG_LEVEL_NORMAL, _("  Filename:     %s\n"),
>                        data_path);
> @@ -429,9 +424,10 @@ urj_tap_detect_parts (urj_chain_t *chain
>               strcpy (part->stepping, stepping);
>               if (urj_parse_include (chain, data_path, 0) == URJ_STATUS_FAIL)
>                   urj_log_error_describe (URJ_LOG_LEVEL_ERROR);
> -#ifdef ENABLE_BSDL
> +
> +            free (id_name);
> +            free (id_fullname);
>           }
> -#endif
>
>           if (part->active_instruction == NULL)
>               part->active_instruction = urj_part_find_instruction (part,

Well in this case you win. ;)

------------------------------------------------------------------------------
Get a FREE DOWNLOAD! and learn more about uberSVN rich system, 
user administration capabilities and model configuration. Take 
the hassle out of deploying and managing Subversion and the 
tools developers use with it. http://p.sf.net/sfu/wandisco-d2d-2
_______________________________________________
UrJTAG-development mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/urjtag-development

Reply via email to