mirror of
				https://github.com/jart/cosmopolitan.git
				synced 2025-10-25 02:30:57 +00:00 
			
		
		
		
	- Bump redbean up to 2.0 - Trim down the MODE=tiny build a bit - Add Indian Standard Time to zoneinfo
		
			
				
	
	
		
			104 lines
		
	
	
	
		
			2.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			104 lines
		
	
	
	
		
			2.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| #if 0
 | |
| /*─────────────────────────────────────────────────────────────────╗
 | |
| │ To the extent possible under law, Justine Tunney has waived      │
 | |
| │ all copyright and related or neighboring rights to this file,    │
 | |
| │ as it is written in the following disclaimers:                   │
 | |
| │   • http://unlicense.org/                                        │
 | |
| │   • http://creativecommons.org/publicdomain/zero/1.0/            │
 | |
| ╚─────────────────────────────────────────────────────────────────*/
 | |
| #endif
 | |
| #include "libc/dce.h"
 | |
| #include "libc/log/log.h"
 | |
| #include "libc/runtime/gc.internal.h"
 | |
| #include "libc/stdio/stdio.h"
 | |
| #include "libc/x/x.h"
 | |
| #include "net/http/escape.h"
 | |
| #include "net/http/http.h"
 | |
| #include "third_party/getopt/getopt.h"
 | |
| #include "third_party/stb/stb_image.h"
 | |
| 
 | |
| #define USAGE \
 | |
|   " [FLAGS] IMG...\n\
 | |
| Utility for printing HTML <img> tags.\n\
 | |
| \n\
 | |
| FLAGS\n\
 | |
| \n\
 | |
|   -h      Help\n\
 | |
|   -a      Wrap with <a> tag\n\
 | |
|   -u      Embed data:base64 URI\n"
 | |
| 
 | |
| int scale;
 | |
| bool linktag;
 | |
| bool datauri;
 | |
| bool sizeonly;
 | |
| 
 | |
| void PrintUsage(int rc, FILE *f) {
 | |
|   fputs("Usage: ", f);
 | |
|   fputs(program_invocation_name, f);
 | |
|   fputs(USAGE, f);
 | |
|   exit(rc);
 | |
| }
 | |
| 
 | |
| void PrintImg(const char *path) {
 | |
|   size_t n;
 | |
|   int opt, i, yn, xn, cn, w, h;
 | |
|   void *img, *pix, *src, *mime;
 | |
|   if (!(img = gc(xslurp(path, &n)))) exit(2);
 | |
|   if (!(pix = gc(stbi_load_from_memory(img, n, &xn, &yn, &cn, 0)))) exit(3);
 | |
|   if (linktag) {
 | |
|     printf("<a href=\"%s\"\n  >", path);
 | |
|   }
 | |
|   src = path;
 | |
|   if (datauri) {
 | |
|     src = xasprintf("data:%s;base64,%s", FindContentType(path, -1),
 | |
|                     gc(EncodeBase64(img, n, &n)));
 | |
|   }
 | |
|   w = (xn + (1 << scale) / 2) >> scale;
 | |
|   h = (yn + (1 << scale) / 2) >> scale;
 | |
|   if (sizeonly) {
 | |
|     printf("width=\"%d\" height=\"%d\"", w, h);
 | |
|   } else {
 | |
|     printf("<img width=\"%d\" height=\"%d\" alt=\"[%s]\"\n     src=\"%s\">", w,
 | |
|            h, path, src);
 | |
|   }
 | |
|   if (linktag) {
 | |
|     printf("</a>");
 | |
|   }
 | |
|   printf("\n");
 | |
| }
 | |
| 
 | |
| int main(int argc, char *argv[]) {
 | |
|   if (!NoDebug()) ShowCrashReports();
 | |
|   int i;
 | |
|   while ((i = getopt(argc, argv, "?huas01234")) != -1) {
 | |
|     switch (i) {
 | |
|       case '0':
 | |
|       case '1':
 | |
|       case '2':
 | |
|       case '3':
 | |
|       case '4':
 | |
|         scale = i - '0';
 | |
|         break;
 | |
|       case 's':
 | |
|         sizeonly = true;
 | |
|         break;
 | |
|       case 'a':
 | |
|         linktag = true;
 | |
|         break;
 | |
|       case 'u':
 | |
|         datauri = true;
 | |
|         break;
 | |
|       case '?':
 | |
|       case 'h':
 | |
|         PrintUsage(0, stdout);
 | |
|       default:
 | |
|         PrintUsage(1, stderr);
 | |
|     }
 | |
|   }
 | |
|   if (optind == argc) {
 | |
|     PrintUsage(1, stderr);
 | |
|   }
 | |
|   for (i = optind; i < argc; ++i) {
 | |
|     PrintImg(argv[i]);
 | |
|   }
 | |
| }
 |