Programming Skills-table-driven programming

Source: Internet
Author: User
Tags format definition
/* Image format-dependent operations. */typedef struct {jas_image_t *(*decode)(jas_stream_t *in, char *opts);/* Decode image data from a stream. */int (*encode)(jas_image_t *image, jas_stream_t *out, char *opts);/* Encode image data to a stream. */int (*validate)(jas_stream_t *in);/* Determine if stream data is in a particular format. */} jas_image_fmtops_t;/* Image format information. */typedef struct {int id;/* The ID for this format. */char *name;/* The name by which this format is identified. */char *ext;/* The file name extension associated with this format. */char *desc;/* A brief description of the format. */jas_image_fmtops_t ops;/* The operations for this format. */} jas_image_fmtinfo_t;

This code is extracted from the source code of Jasper. The jas_image_fmtops_t struct defines three function pointers, which are basic operations on images. S_image_fmtinfo_t describes the most basic attributes of an image. Including the ID and format definition. At the beginning, I didn't understand why I defined the ID as an enumeration type instead of an int. When I see the following code, I know.

Let's look at the following code:

Jas_init

/* Initialize the image format table. */int jas_init(){jas_image_fmtops_t fmtops;int fmtid;fmtid = 0;#if !defined(EXCLUDE_MIF_SUPPORT)fmtops.decode = mif_decode;fmtops.encode = mif_encode;fmtops.validate = mif_validate;jas_image_addfmt(fmtid, "mif", "mif", "My Image Format (MIF)", &fmtops);++fmtid;#endif#if !defined(EXCLUDE_PNM_SUPPORT)fmtops.decode = pnm_decode;fmtops.encode = pnm_encode;fmtops.validate = pnm_validate;jas_image_addfmt(fmtid, "pnm", "pnm", "Portable Graymap/Pixmap (PNM)",  &fmtops);jas_image_addfmt(fmtid, "pnm", "pgm", "Portable Graymap/Pixmap (PNM)",  &fmtops);jas_image_addfmt(fmtid, "pnm", "ppm", "Portable Graymap/Pixmap (PNM)",  &fmtops);++fmtid;#endif#if !defined(EXCLUDE_BMP_SUPPORT)fmtops.decode = bmp_decode;fmtops.encode = bmp_encode;fmtops.validate = bmp_validate;jas_image_addfmt(fmtid, "bmp", "bmp", "Microsoft Bitmap (BMP)", &fmtops);++fmtid;#endif#if !defined(EXCLUDE_RAS_SUPPORT)fmtops.decode = ras_decode;fmtops.encode = ras_encode;fmtops.validate = ras_validate;jas_image_addfmt(fmtid, "ras", "ras", "Sun Rasterfile (RAS)", &fmtops);++fmtid;#endif#if !defined(EXCLUDE_JP2_SUPPORT)fmtops.decode = jp2_decode;fmtops.encode = jp2_encode;fmtops.validate = jp2_validate;jas_image_addfmt(fmtid, "jp2", "jp2",  "JPEG-2000 JP2 File Format Syntax (ISO/IEC 15444-1)", &fmtops);++fmtid;fmtops.decode = jpc_decode;fmtops.encode = jpc_encode;fmtops.validate = jpc_validate;jas_image_addfmt(fmtid, "jpc", "jpc",  "JPEG-2000 Code Stream Syntax (ISO/IEC 15444-1)", &fmtops);++fmtid;#endif#if !defined(EXCLUDE_JPG_SUPPORT)fmtops.decode = jpg_decode;fmtops.encode = jpg_encode;fmtops.validate = jpg_validate;jas_image_addfmt(fmtid, "jpg", "jpg", "JPEG (ISO/IEC 10918-1)", &fmtops);++fmtid;#endif#if !defined(EXCLUDE_PGX_SUPPORT)fmtops.decode = pgx_decode;fmtops.encode = pgx_encode;fmtops.validate = pgx_validate;jas_image_addfmt(fmtid, "pgx", "pgx", "JPEG-2000 VM Format (PGX)", &fmtops);++fmtid;#endif/* We must not register the JasPer library exit handler until afterat least one memory allocation is performed.  This is desirableas it ensures that the JasPer exit handler is called before thedebug memory allocator exit handler. */atexit(jas_cleanup);return 0;}

  

int jas_image_addfmt(int id, char *name, char *ext, char *desc,  jas_image_fmtops_t *ops){jas_image_fmtinfo_t *fmtinfo;assert(id >= 0 && name && ext && ops);if (jas_image_numfmts >= JAS_IMAGE_MAXFMTS) {return -1;}fmtinfo = &jas_image_fmtinfos[jas_image_numfmts];fmtinfo->id = id;if (!(fmtinfo->name = jas_strdup(name))) {return -1;}if (!(fmtinfo->ext = jas_strdup(ext))) {jas_free(fmtinfo->name);return -1;}if (!(fmtinfo->desc = jas_strdup(desc))) {jas_free(fmtinfo->name);jas_free(fmtinfo->ext);return -1;}fmtinfo->ops = *ops;++jas_image_numfmts;return 0;}

Jas_image_fmtinfos is an array of the jas_image_fmtinfo_t type.

The answer is coming soon:
From the code above, we can see that the author uses table-driven programming. The global variable jas_image_fmtinfos stores all supported image formats. Each time you add or delete a format, you only need to modify the jas_init code, and the format number is dynamic. You can search for the array each time you use it.
Let's take a look at the code used. This function is numbered based on the suffix.
Int jas_image_fmtfromname (char * name)
int jas_image_fmtfromname(char *name){int i;char *ext;jas_image_fmtinfo_t *fmtinfo;/* Get the file name extension. */if (!(ext = strrchr(name, ‘.‘))) {return -1;}++ext;/* Try to find a format that uses this extension. */for (i = 0, fmtinfo = jas_image_fmtinfos; i < jas_image_numfmts; ++i,  ++fmtinfo) {/* Do we have a match? */if (!strcmp(ext, fmtinfo->ext)) {return fmtinfo->id;}}return -1;}

From the code above, we can see that each time you query the format of the suffix, compare the current suffix name with the suffix name in the jas_image_fmtinfos array to determine the ID, and the scalability is excellent.

 

Contact Us

The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.