1 /* test_main.cpp
2  * by pts@fazekas.hu at Sun Feb 24 16:24:38 CET 2002
3  */
4 
5 #include "gensi.hpp"
6 #include "gensio.hpp"
7 #include "image.hpp"
8 #include "error.hpp"
9 #include "encoder.hpp"
10 #include "minips.hpp"
11 #include "mapping.hpp"
12 
13 #if OBJDEP
14 #  warning PROVIDES: test_main
15 #  warning REQUIRES: gensi.o
16 #  warning REQUIRES: gensio.o
17 #  warning REQUIRES: image.o
18 #  warning REQUIRES: error.o
19 #  warning REQUIRES: encoder.o
20 #  warning REQUIRES: minips.o
21 #  warning REQUIRES: mapping.o
22 #endif
23 
24 #include <stdio.h>
25 #include <stdlib.h>
26 #include <string.h>
27 
28 Files::FILEW sout(stdout);
29 
30 #if OBJDEP
31 #  warning REQUIRES: in_xpm.o
32 #  warning REQUIRES: in_lbm.o
33 #  warning REQUIRES: in_gif.o
34 #  warning REQUIRES: in_bmp.o
35 #  warning REQUIRES: in_pnm.o
36 #  warning REQUIRES: in_tga.o
37 #endif
38 extern Image::Loader in_xpm_loader;
39 extern Image::Loader in_lbm_loader;
40 extern Image::Loader in_gif_loader;
41 extern Image::Loader in_bmp_loader;
42 extern Image::Loader in_pnm_loader;
43 extern Image::Loader in_tga_loader;
init_loader()44 static void init_loader() {
45   Image::register0(&in_tga_loader); /* checker not sure; install early */
46   Image::register0(&in_xpm_loader);
47   Image::register0(&in_lbm_loader);
48   Image::register0(&in_gif_loader);
49   Image::register0(&in_bmp_loader);
50   Image::register0(&in_pnm_loader);
51   sout << "Available Loaders:";
52   Image::printLoaders(sout);
53   sout << ".\n";
54 }
55 
test_data()56 static void test_data() {
57   int i;
58   SimBuffer::Static world("World!");
59   SimBuffer::Static("-1984").toInteger(i);
60   sout << "Hello," << ' ' << world << '\n'
61        << i << " luftballons.\n"
62        << -99U << " negatives.\n";
63   sout << (world >= "FooBar") << '\n'; /// true
64 
65   { bool b=true;
66     SimBuffer::Linked sli; sli << (world>"Zorba");
67     sli.toBool(b);
68     sout << b << '\n'; /// false
69   }
70 
71   SimBuffer::Linked li, lj("LJ");
72   li << "answer is: " << 42L << '\n';
73   li.prepend("The X", 4);
74   lj << "uff.";
75   lj=li;
76   lj.prepend("D.A said: ",10);
77   sout << li; /// The answer is 42
78   sout << lj; /// D.A said: The answer is 42
79 
80   { Buffer b="Hello!\n"; /* <= 8 chars */
81     sout << b;
82   }
83   { Buffer b="Hello, World!\n"; /* > 8 chars */
84     sout << b;
85   }
86   { sout << "Hello,"+Buffer(" World2!\n"); }
87   { Buffer b; b.format("Hello,%cWorld %d%s", ' ', -42, "!\n"); sout << b; }
88   { Buffer b; b.format("123456789012\n"); sout << b; }
89   { Buffer b; b.format("1234567890123\n"); sout << b; }
90   { Buffer b; b.format("12345678901234\n"); sout << b; }
91   { Buffer b; b.format("123456789012345\n"); sout << b; }
92   { Buffer b; b.format("1234567890123456\n"); sout << b; }
93   { Buffer b; b.format("1234567890%u\n",123456789L); sout << b; }
94   { Buffer b("Hello, World!\n"); memcpy(b.substr_grow(7,5,3), "Bar", 3); sout << b; }
95   { Buffer b("Hello, World!\n"); memcpy(b.substr_grow(7,5,6), "FooBar", 6); sout << b; }
96   { Buffer b("Hello, World!\n"); memcpy(b.substr_grow(7,15,8), "FooBar!\n", 8); sout << b; }
97   { Buffer b("Hello, World!"); memcpy(b.substr_grow(17,15,8), "HowDYD?\n", 8); sout << b; }
98   { Buffer b="bena"; Buffer c; c=(SimBuffer::Flat)b; }
99   sout << "Done.\n";
100 }
101 
102 #if OBJDEP
103 #  warning REQUIRES: image.o
104 #endif
test_image()105 static void test_image() {
106   // Image::Sampled *img=Image::load("at-logo.xpm");
107   // Image::Sampled *img=Image::load("pts.xpm");
108   // Image::Sampled *img=Image::load("tex5.xpm");
109   // Image::Sampled *img=Image::load("at-logo.lbm");
110   // Image::Sampled *img=Image::load("ptest.lbm");
111   // Image::Sampled *img=Image::load("chessbrd.lbm");
112   // Image::Sampled *img=Image::load("at-logo.gif");
113   // Image::Sampled *img=Image::load("ptsbanner.gif");
114   // Image::Sampled *img=Image::load("ptsbanner.bmp");
115   // Image::Sampled *img=Image::load("pts.bmp");
116   // Image::Sampled *img=Image::load("t.cpp");
117   // Image::Sampled *img=Image::load("ptsbanner.tga");
118   // Image::Sampled *img=Image::load("mixing.xpm");
119   Image::Sampled *img=Image::load("mixing0.xpm", SimBuffer::B());
120   Files::FILEW f(fopen("t.ppm","wb")); /* Imp: autoclose... */
121 
122   Image::Sampled *bak=img;
123   img=img->toIndexed(); if (bak!=img) delete bak;
124   assert(img->getTy()==img->TY_INDEXED);
125   sout << "ncol0=" << PTS_dynamic_cast(Image::Indexed*,img)->getNcols() << '\n';
126   PTS_dynamic_cast(Image::Indexed*,img)->packPal();
127   sout << "ncols=" << PTS_dynamic_cast(Image::Indexed*,img)->getNcols() << '\n';
128   PTS_dynamic_cast(Image::Indexed*,img)->setBpc(0);
129   sout << "bpc=" << (int)img->getBpc() << '\n';
130   // Files::tmpRemoveCleanup("t.dump");
131   // Files::tmpRemoveCleanup("t.dump"); /* twice: OK */
132   /* Files::tmpRemoveCleanup("/bin"); */
133   Files::FILEW f2(fopen("t.dump","wb"));
134   PTS_dynamic_cast(Image::Indexed*,img)->dumpDebug(f2);
135   f2.close();
136 
137   f << *img;
138   f.close();
139   // delete img;
140 }
141 
test_encoder()142 static void test_encoder() {
143   // Files::tmpRemove=false; /* Imp: make this a command-line option */
144 
145   { Filter::FILEE a("t.a85");
146     PSEncoder *bp=PSEncoder::newASCII85Encode(a,78);
147     // FlateEncode c(b,5);
148     // LZWEncode c(b);
149     // PipeEncode c(b,"gs -dNODISPLAY -q -c '/i(%stdin)(r)file def/o(%stdout)(w)file/LZWEncode filter def/s 4096 string def{i s readstring exch o exch writestring not{exit}if}loop o closefile quit'");
150     // GSEncode c(b,"xFlateEncode");
151     // PSEncoder *cp=PSEncoder::newLZWEncode(*bp);
152     #if 1
153       PSEncoder *cp=PSEncoder::newRunLengthEncode(*bp);
154       // delete [] cp; exit(0); /* Cannot free a GSEncode with multiple inheritance :-(( -> SegFault. virtual inheritance SUXX */
155       // PSEncoder *cp=PSEncoder::newRunLengthEncode(a);
156 
157       // FILE *fin=fopen("t55","rb");
158       FILE *fin=fopen("t.dump","rb");
159       // FILE *fin=fopen("t.xin","rb");
160 
161       static char mybuf[2033];
162       unsigned long sum=0;
163       while (1) {
164         unsigned size=fread(mybuf, 1, sizeof(mybuf), fin);
165         if (size<1) { fprintf(stderr,"nosiz=%u\n",size); cp->vi_write(0,0); break; }
166         fprintf(stderr, "sending size=%u ofs=%lu\n", size, sum);
167         sum+=size;
168         cp->vi_write(mybuf, size);
169       }
170       assert(feof(fin));
171       assert(!ferror(fin));
172       fprintf(stderr, "ftell=%lu\n", ftell(fin));
173       fclose(fin);
174     #else
175       img->to8();
176       //img->setBpc(0);
177       //sout << "bpc2=" << (int)img->getBpc() << '\n';
178       //Files::FILEW f2(fopen("t.dump2","wb"));
179       //PTS_dynamic_cast(Image::Indexed*,img)->dumpDebug(f2);
180       //f2.close();
181       PSEncoder *cp=PSEncoder::newDCTEncode(*bp, img->getWd(), img->getHt(), 1);
182       cp->vi_write(img->getRowbeg(), img->getWd()*img->getHt());
183       cp->vi_write(0,0);
184     #endif
185 
186     delete cp;
187     delete bp;
188   }
189 }
190 
test_predictor()191 static void test_predictor() {
192   /* by pts@fazekas.hu at Tue Mar 12 10:51:27 CET 2002 */
193   Image::SampledInfo info(Image::load("mixing1.xpm", SimBuffer::B()));
194   info.setSampleFormat(Image::SF_Indexed2, false, false, 0x1000000L);
195   Image::Sampled *img=info.getImg();
196 
197   /* Imp: test predictors with rgb-4 */
198   unsigned char pred=11;
199   Files::FILEW f2(fopen("predictor_gen.eps","wb"));
200   f2 << "%!PS-Adobe-3.0 EPSF-3.0\n%%BoundingBox: 0 0 " << img->getWd() << ' ' << img->getHt() << "\n%%EndComments\n"
201      << "% `*image' forces grayscale :-(\nsave 99 dict begin\n"
202         "{[ /Indexed /DeviceRGB " << ((img->getRowbeg()-img->getHeadp())/3-1) << "  currentfile " << (img->getRowbeg()-img->getHeadp()) << " string readstring pop ] setcolorspace\n"
203         "/f currentfile <</Predictor " << (((unsigned)pred)%30) << " /Columns " << img->getWd() << " /Colors " << (unsigned)img->getCpp() << " /BitsPerComponent " << (unsigned)img->getBpc() << ">> /FlateDecode filter def\n"
204 //        "/f currentfile /FlateDecode filter def\n"
205      << img->getWd() << ' ' << img->getHt() << ' ' << (unsigned)img->getBpc()
206      << "[1 0 0 -1 0 " << img->getHt() << "]f image\nf closefile}\n"
207         "%%BeginData:\nexec\n";
208   f2.vi_write(img->getHeadp(), img->getRowbeg()-img->getHeadp()); /* Write palette */
209   PSEncoder *bp=PSEncoder::newFlateEncode(f2);
210   // Encoder *cp=Encoder::newTIFFPredictor2(*bp, img->getBpc(), img->getWd(),  img->getCpp());
211   // Encoder *cp=Encoder::newPNGPredictor11(*bp, img->getBpc(), img->getWd(),  img->getCpp());
212   Encoder *cp=PSEncoder::newPredictor(*bp, pred, img->getBpc(), img->getWd(),  img->getCpp());
213   cp->vi_write(img->getRowbeg(), img->getRlen()*img->getHt());
214   cp->vi_write(0,0);
215   f2 << "\n%%EndData\nend\nrestore showpage\n%%Trailer\n%%EOF\n";
216   f2.close();
217 
218   /* destructor of info frees all memory */
219 }
220 
test_dump()221 static void test_dump() {
222   MiniPS::VALUE e=(MiniPS::VALUE)new MiniPS::Dict();
223   MiniPS::VALUE d=(MiniPS::VALUE)new MiniPS::Dict();
224   MiniPS::VALUE a=(MiniPS::VALUE)new MiniPS::Array();
225   MiniPS::RARRAY(a)->push(MiniPS::Qinteger(3));
226   MiniPS::VALUE b=(MiniPS::VALUE)new MiniPS::Array();
227   MiniPS::RARRAY(b)->push(MiniPS::Qinteger(4));
228   MiniPS::RARRAY(b)->push(MiniPS::Qinteger(5));
229   MiniPS::RARRAY(b)->push(MiniPS::Qinteger(6));
230   MiniPS::RARRAY(b)->push((MiniPS::VALUE)new MiniPS::String("Hel\t�na \n\n\n\n\n\n\n",15));
231 #if 0
232   MiniPS::RDICT(d)->push((MiniPS::VALUE)new MiniPS::Sname("/alma",5), MiniPS::Qinteger(42));
233   MiniPS::RDICT(d)->push((MiniPS::VALUE)new MiniPS::Sname("/korte",6), MiniPS::Qnull);
234   MiniPS::RDICT(d)->push((MiniPS::VALUE)new MiniPS::Sname("/szilva",7), MiniPS::Qtrue);
235   MiniPS::RDICT(d)->push((MiniPS::VALUE)new MiniPS::Sname("/narancs",8), MiniPS::Qfalse);
236   MiniPS::RDICT(d)->push((MiniPS::VALUE)new MiniPS::Sname("/naranc2",8), (MiniPS::VALUE)new MiniPS::Array());
237   MiniPS::RDICT(d)->push((MiniPS::VALUE)new MiniPS::Sname("/naranc3",8), a);
238   MiniPS::RDICT(d)->push((MiniPS::VALUE)new MiniPS::Sname("/naranc4",8), b);
239   MiniPS::RDICT(d)->push((MiniPS::VALUE)new MiniPS::Sname("/naranc5",8), e);
240 #else
241   MiniPS::RDICT(d)->push("/alma",5, MiniPS::Qinteger(42));
242   MiniPS::RDICT(d)->push("/korte",6, MiniPS::Qnull);
243   MiniPS::RDICT(d)->push("/szilva",7, MiniPS::Qtrue);
244   MiniPS::RDICT(d)->push("/narancs",8, MiniPS::Qfalse);
245   MiniPS::RDICT(d)->push("/naranc2",8, (MiniPS::VALUE)new MiniPS::Array());
246   MiniPS::RDICT(d)->push("/naranc3",8, a);
247   MiniPS::RDICT(d)->push("/naranc4",8, b);
248   MiniPS::RDICT(d)->push("/naranc5",8, e);
249 #endif
250   MiniPS::dump(sout, d);
251   MiniPS::delete0(d);
252 }
253 
test_tokenizer()254 static void test_tokenizer() {
255   Files::FILER sin(stdin);
256   MiniPS::Tokenizer pst(sin);
257   int i;
258   while ((i=pst.yylex())!=pst.EOFF) {
259     putchar(i);
260     putchar('\n');
261   }
262 }
263 
test_parser()264 static void test_parser() {
265   { MiniPS::Parser p("-"); /* STDIN */
266     MiniPS::VALUE d=p.parse1();
267     MiniPS::dump(sout, d);
268     MiniPS::delete0(d);
269   }
270 }
271 
272 
test_hash()273 static void test_hash() {
274   {Mapping::H h(6);
275   h.set("alma",4,"apple");
276   printf("alma=%s.\n", h.get("alma",4));
277   printf("korte=%s.\n", h.get("korte",5));
278   h.set("korte",5,"bear_");
279   printf("alma=%s.\n", h.get("alma",4));
280   printf("kort=%s.\n", h.get("korte",4));
281   printf("korte=%s.\n", h.get("korte",5));
282   }
283 
284   /* Dat: this might take a long time to run */
285   /* Imp: srand, but that would make the test less predictable */
286   char tmp[2];
287   unsigned i, j;
288   Mapping::H h(sizeof(tmp));
289   for (i=0; i<10000000; i++) {
290     // printf("%u\n", i);
291     for (j=0; j<sizeof(tmp); ) tmp[j++]=rand();
292     if ((rand()&3)!=0) h.set(tmp, sizeof(tmp), tmp);
293                   else h.deletee(tmp, sizeof(tmp));
294     // putchar('.');
295     // h.rehash();
296   }
297   printf("OK!\n");
298 }
299 
test_decoder()300 static void test_decoder() {
301   SimBuffer::B sb("Hello, World!\n");
302   char const*p=sb();
303   Filter::FlatD fd(sb(), sb.getLength());
304   Filter::PipeD pd(fd, "tr A-Z a-z <%S");
305   int i;
306   while ((i=pd.vi_getcc())>=0) {
307     putchar(':');
308     putchar(i);
309     if (i!=(*p>='A' && *p<='Z'?*p+'a'-'A':*p)) abort();
310     p++;
311   }
312   pd.vi_read(0,0);
313   /* Dat: the destructors do their jobs; freeing is not necessary */
314 }
315 
main(int argc,char ** argv)316 int main(int argc, char **argv) {
317   (void)argc;
318   (void)argv;
319 
320   Error::argv0=argc>=1 ? argv[0] : "test_main"; /* Imp: update this */
321   Error::tmpargv0="test_main";
322   Files::tmpRemove=0;
323   init_loader();
324 
325   test_data();
326   test_hash();
327   test_decoder();
328   // test_image();  // Needs file and more refactoring.
329   // test_encoder();  // Needs file.
330   test_dump();
331   // test_parser();  // Needs stdin.
332   // test_tokenizer();  // Needs stdin.
333   // test_predictor();  // Needs file and more refactoring.
334 
335   sout << "Success (test_main).\n";
336   fflush(stdout);
337   Error::cexit(Error::runCleanups(0));
338   assert(0);
339   return 0; /*notreached*/
340 }
341