VM Maker: ImageFormat-dtl.40.mcz

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view
|

VM Maker: ImageFormat-dtl.40.mcz

commits-2
 
David T. Lewis uploaded a new version of ImageFormat to project VM Maker:
http://source.squeak.org/VMMaker/ImageFormat-dtl.40.mcz

==================== Summary ====================

Name: ImageFormat-dtl.40
Author: dtl
Time: 7 April 2020, 6:52:52.916756 pm
UUID: 9fb30b03-38be-430a-a43d-e91be4a3ee5a
Ancestors: ImageFormat-dtl.39

For generating the ckformat.c program source, do not use CrLfFileStream because it is no longer supported in newer Squeak versions. Instead, assume that the target platform is Unix and emit newline line terminators. If necessary, other platforms will be required to handle line terminator conversion.

=============== Diff against ImageFormat-dtl.39 ===============

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"
- 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 */'; lf;
+ nextPutAll: '/* for use in a shell script to test image format requirements. */'; lf;
+ nextPutAll: '/* A non-zero return status code indicates failure. */'; lf; lf;
+ nextPutAll: '/* Usage: ', programName, ' imageFileName */'; lf; lf;
+ nextPutAll: '/* --- DO NOT EDIT THIS FILE --- */'; lf;
+ nextPutAll: '/* --- Automatically generated from class ', self name, ' ', DateAndTime now asString, '--- */'; lf;
+ nextPutAll: '/* --- Source code is in package ImageFormat in the VMMaker repository --- */'; lf;
+ nextPutAll: '/* --- DO NOT EDIT THIS FILE --- */'; lf; lf;
+ nextPutAll: '#include <stdio.h>'; lf;
+ nextPutAll: '#include <stdlib.h>'; lf;
+ nextPutAll: '#include <string.h>'; lf; lf;
+ nextPutAll: 'int main(int argc, char **argv) {'; lf;
+ tab; nextPutAll: 'FILE *f;'; lf;
+ tab; nextPutAll: 'unsigned char buf[8];'; lf;
+ tab; nextPutAll: 'int formatNumber;'; lf;
+ tab; nextPutAll: 'unsigned char c;'; lf;
+ tab; nextPutAll: 'int match;'; lf;
+ tab; nextPutAll: 'if (argc !!= 2) {'; lf;
+ tab; tab; nextPutAll: 'printf("usage: ', programName,  ' imageFileName\n");'; lf;
+ tab; tab; nextPutAll: 'exit(1);'; lf;
+ tab; nextPutAll: '}'; lf;
+ tab; nextPutAll: 'f = fopen(argv[1], "r");'; lf;
+ tab; nextPutAll: 'if (f == NULL) {'; lf;
+ tab; tab; nextPutAll: 'perror(argv[1]);'; lf;
+ tab; tab; nextPutAll: 'exit(2);'; lf;
+ tab; nextPutAll: '}'; lf.
- 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: 'int 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) {';lf;
+ tab; tab; nextPutAll: 'fprintf(stderr, "cannot go to pos %d in %s\n", '; nextPutAll: offset asString; nextPutAll: ', argv[1]);'; lf;
+ tab; tab; nextPutAll: 'exit(3);'; lf;
+ tab; nextPutAll: '}'; lf;
+ tab; nextPutAll: 'if (fread(buf, 1, 8, f) < 8) {'; lf;
+ tab; tab; nextPutAll: 'fprintf(stderr, "cannot read %s\n", argv[1]);'; lf;
+ tab; tab; nextPutAll: 'exit(3);'; lf;
+ tab; nextPutAll: '}'; lf.
- 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: '{'; lf; tab; nextPutAll: 'unsigned char ', b, '[', v size 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: '};'; lf;
+ tab; nextPutAll: 'if (memcmp(buf, ', b, ', ', v size asString, ') == 0) {'; lf;
+ tab; tab; nextPutAll: 'printf("%d\n", ', formatNumber, ');'; lf;
+ tab; tab; nextPutAll: 'exit(0);'; lf;
+ tab; nextPutAll: '}'; lf; tab; nextPutAll: '}'; lf]].
+ stream tab; nextPutAll: 'printf("0\n"); /* print an invalid format number */';lf;
+ tab; nextPutAll: 'exit (-1); /* not found, exit with error code */'; lf;
+ nextPutAll: '}'; lf
- stream nextPutAll: '};'; cr;
- tab; nextPutAll: 'if (memcmp(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
  !

Item was changed:
  ----- Method: ImageFormat class>>storeCkFormatOnFile: (in category 'ckformat') -----
  storeCkFormatOnFile: fileName
  "Store source code for an image format version reader in a file. 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."
 
  | f |
+ f := FileStream newFileNamed: fileName.
- f := CrLfFileStream newFileNamed: fileName.
  [self generateCkFormatProgram: 'ckformat' on: f]
  ensure: [f ifNotNil: [f close]].
  ^fileName!