[Vm-dev] VM Maker: ImageFormat-dtl.29.mcz

David T. Lewis lewis at mail.msen.com
Fri Apr 13 03:17:56 UTC 2018


Hi,

Catching up on email.

With all due respect, no I am not going to rewrite it. And thank you to
Subbu for catching a serious error in the code.

For those who may not know the background, the ckformat program is used
in the classic interpreter VM distribution, and supports the /usr/bin/squeak
mechanism for selecting whether cog for 32 bit V3 image, interpreter VM for
32 bit V3 image, or interpreter VM for 64 bit image should be be used.

The rationale for storing and writing the ckformat.c source code from
ImageFormat class>>createCkFormatProgram is to keep the source in sync
with any updates that may be made to ImageFormat.

Thus if someone invents a new image format, and gives it a new image
format number that is documented in class ImageFormat, then the source
code for the ckformat utility is automatically updated accordingly.

The ckformat utility can also be used to select the right cog or spur32
or spur64 or intepreter32/64 VM for a given image file, although some
naming conventions will need to be agreed for the various VM installations.

Dave


On Wed, Apr 11, 2018 at 11:49:02AM -0700, Eliot Miranda wrote:
>  
> Hi David, Subbu,
> 
>     forgive me...
> 
> > On Apr 11, 2018, at 4:54 AM, commits at source.squeak.org wrote:
> > 
> > 
> > David T. Lewis uploaded a new version of ImageFormat to project VM Maker:
> > http://source.squeak.org/VMMaker/ImageFormat-dtl.29.mcz
> > 
> > ==================== Summary ====================
> > 
> > Name: ImageFormat-dtl.29
> > Author: dtl
> > Time: 11 April 2018, 8:54:16.07 am
> > UUID: ea0c2ff3-c413-4917-a6fb-8177e5a2ebec
> > Ancestors: ImageFormat-dtl.28
> > 
> > Fix by K K Subbu: Use memcmp instead of strncmp in ckformat to compare byte arrays.
> > 
> > =============== Diff against ImageFormat-dtl.28 ===============
> > 
> > Item was changed:
> >  ----- Method: ImageFormat class>>generateCkFormatProgram:on: (in category 'ckformat') -----
> >  generateCkFormatProgram: programName on: stream
> >      "Generate source code for an image format version reader. The program
> >      is intended for testing image file format from a unix shell script such that
> >      the shell script can decide what VM to run based on image requirements."
> > 
> >      | formatNumber |
> >      stream nextPutAll: '/* ', programName, ': Print the image format number on standard output */'; cr;
> >              nextPutAll: '/* for use in a shell script to test image format requirements. */'; cr;
> >              nextPutAll: '/* A non-zero return status code indicates failure. */'; cr; cr;
> >              nextPutAll: '/* Usage: ', programName, ' imageFileName */'; cr; cr;
> >              nextPutAll: '/* --- DO NOT EDIT THIS FILE --- */'; cr;
> >              nextPutAll: '/* --- Automatically generated from class ', self name, ' ', DateAndTime now asString, '--- */'; cr;
> >              nextPutAll: '/* --- Source code is in package ImageFormat in the VMMaker repository --- */'; cr;
> >              nextPutAll: '/* --- DO NOT EDIT THIS FILE --- */'; cr; cr;
> >              nextPutAll: '#include <stdio.h>'; cr;
> >              nextPutAll: '#include <stdlib.h>'; cr;
> >              nextPutAll: '#include <string.h>'; cr; cr;
> >              nextPutAll: 'main(int argc, char **argv) {'; cr;
> >              tab; nextPutAll: 'FILE *f;'; cr;
> >              tab; nextPutAll: 'unsigned char buf[8];'; cr;        
> >              tab; nextPutAll: 'int formatNumber;'; cr;        
> >              tab; nextPutAll: 'unsigned char c;'; cr;        
> >              tab; nextPutAll: 'int match;'; cr;        
> >              tab; nextPutAll: 'if (argc !!= 2) {'; cr;
> >              tab; tab; nextPutAll: 'printf("usage: ', programName,  ' imageFileName\n");'; cr;
> >              tab; tab; nextPutAll: 'exit(1);'; cr;
> >              tab; nextPutAll: '}'; cr;
> >              tab; nextPutAll: 'f = fopen(argv[1], "r");'; cr;
> >              tab; nextPutAll: 'if (f == NULL) {'; cr;
> >              tab; tab; nextPutAll: 'perror(argv[1]);'; cr;
> >              tab; tab; nextPutAll: 'exit(2);'; cr;
> >              tab; nextPutAll: '}'; cr.
> >      { 0. 512 } do: [:offset |
> >          stream
> >              tab; nextPutAll: 'if(fseek(f, '; nextPutAll: offset asString; nextPutAll: 'L, SEEK_SET) !!= 0) {';cr;
> >              tab; tab; nextPutAll: 'fprintf(stderr, "cannot go to pos %d in %s\n", '; nextPutAll: offset asString; nextPutAll: ', argv[1]);'; cr;
> >              tab; tab; nextPutAll: 'exit(3);'; cr;
> >              tab; nextPutAll: '}'; cr;
> >              tab; nextPutAll: 'if (fread(buf, 1, 8, f) < 8) {'; cr;
> >              tab; tab; nextPutAll: 'fprintf(stderr, "cannot read %s\n", argv[1]);'; cr;
> >              tab; tab; nextPutAll: 'exit(3);'; cr;
> >              tab; nextPutAll: '}'; cr.
> >          self versionNumberByteArrays withIndexDo: [ :v :tag | | b |
> >              formatNumber := (self fromBytes: v) asInteger.
> >              b := 'b_', formatNumber asString, '_', tag asString.
> >              stream tab; nextPutAll: '{'; cr; tab; nextPutAll: 'unsigned char ', b, '[', v size asString, ']= { '.
> >              v inject: true into: [:first : elem |
> >                  first ifFalse: [stream nextPutAll: ', '].
> >                  stream nextPutAll: elem asString.
> >                  false].
> >              stream nextPutAll: '};'; cr;
> > +                    tab; nextPutAll: 'if (memcmp(buf, ', b, ', ', v size asString, ') == 0) {'; cr;
> > -                    tab; nextPutAll: 'if (strncmp(buf, ', b, ', ', v size asString, ') == 0) {'; cr;
> >                      tab; tab; nextPutAll: 'printf("%d\n", ', formatNumber, ');'; cr;
> >                      tab; tab; nextPutAll: 'exit(0);'; cr;
> >                      tab; nextPutAll: '}'; cr; tab; nextPutAll: '}'; cr]].
> >      stream tab; nextPutAll: 'printf("0\n"); /* print an invalid format number */';cr;
> >              tab; nextPutAll: 'exit (-1); /* not found, exit with error code */'; cr;
> >              nextPutAll: '}'; cr
> >  !
> 
> This is unreadable.  Either express it as a string or as a Slang program; anything but this horrid mashup of nextPutAll:s and C fragments :-(


More information about the Vm-dev mailing list