summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/source/latex/crossword/AcrossLite/usaconv.c
diff options
context:
space:
mode:
Diffstat (limited to 'Master/texmf-dist/source/latex/crossword/AcrossLite/usaconv.c')
-rw-r--r--Master/texmf-dist/source/latex/crossword/AcrossLite/usaconv.c229
1 files changed, 229 insertions, 0 deletions
diff --git a/Master/texmf-dist/source/latex/crossword/AcrossLite/usaconv.c b/Master/texmf-dist/source/latex/crossword/AcrossLite/usaconv.c
new file mode 100644
index 00000000000..9f8433d4fd3
--- /dev/null
+++ b/Master/texmf-dist/source/latex/crossword/AcrossLite/usaconv.c
@@ -0,0 +1,229 @@
+
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#define ROWSIZE 256
+
+FILE *infile;
+int width, height, j, k, ccount, mcount, anum, dnum;
+int apos, dpos;
+int acount, dcount;
+
+char inbuf[ROWSIZE];
+
+/* Here is a lazy programmer's waste of space. */
+char aspace[ROWSIZE][ROWSIZE];
+char dspace[ROWSIZE][ROWSIZE];
+
+char rowtext[10*ROWSIZE];
+char tmp[ROWSIZE];
+
+char title[80];
+char author[80];
+char copyright[80];
+char matrix[ROWSIZE*ROWSIZE*10];
+char actext[ROWSIZE][80];
+char dctext[ROWSIZE][80];
+char aclues[ROWSIZE*15*16];
+char dclues[ROWSIZE*15*16];
+
+void fgetsa(char *, int, FILE *);
+
+void main(int argc, char *argv[])
+{
+
+/* Open the puzzle file. */
+ if (argc < 2) {
+ printf("Usage: usaconv <puzzle file>\n");
+ exit(1);
+ }
+ infile = fopen(argv[1], "r");
+ if (infile == NULL) {
+ printf("Error opening %s.\n");
+ exit(1);
+ }
+
+/* From here on we're assuming a non-corrupt puzzle file.
+ An enhancement later could be to check for this. */
+
+/* start reading stuff in */
+ fgetsa(inbuf, 80, infile); /*<ACROSS PUZZLE>*/
+ fgetsa(inbuf, 80, infile); /*<TITLE>*/
+ fgetsa(title, 80, infile);
+ fgetsa(inbuf, 80, infile); /*<AUTHOR>*/
+ fgetsa(author, 80, infile);
+ fgetsa(inbuf, 80, infile); /*<COPYRIGHT>*/
+ fgetsa(copyright,80, infile);
+ fgetsa(inbuf, 80, infile); /*<SIZE>*/
+
+ fgetsa(inbuf, 80, infile);
+ height = width = 0 ; /* we calculate instead */
+
+ fgetsa(inbuf, 80, infile); /*<GRID>*/
+
+/* Read in the first line of the solution/diagram and determine width */
+ fgetsa(&aspace[height][0], 80, infile);
+ width = strlen(&aspace[height][0]);
+ height++;
+ while (1) {
+ fgetsa(&aspace[height][0], 80, infile);
+ if(strcmp(&aspace[height][0],"<ACROSS>")==0) goto didit;
+ height++;
+ }
+didit:
+ /* Read and save across and down clues */
+
+ apos=dpos=0;
+ while(1) {
+ fgetsa(&actext[apos][0], 80, infile);
+ if(strcmp(&actext[apos][0],"<DOWN>")==0)goto dida;
+ apos++;
+ }
+dida:
+ while(1) {
+ fgetsa(&dctext[dpos][0], 80, infile);
+ if(feof(infile)) goto didd;
+ dpos++;
+ }
+didd:
+ apos=dpos=0;
+
+/* Now we are ready to produce the LaTeX stuff for the
+ puzzle diagram. Again we are assuming we have an unscrambled
+ solution. How can we know this? Put on TODO list. */
+
+/* We write to standard out. Lazy but effective. */
+
+ printf("\\documentclass{article}\n");
+ printf("\\usepackage{cwpuzzle}\n");
+ printf("\\title{%s}\n", title);
+ printf("\\author{%s}\n", author);
+ printf("\\date{%s}\n", copyright);
+ printf("\\voffset -1in\n");
+ printf("\\hoffset -1in\n");
+ printf("\\begin{document}\n");
+
+ ccount = 0;
+ mcount = 0;
+ acount = dcount = 0;
+
+ for (j=0; j<height; j++) {
+ strcpy(rowtext,"\0");
+ for (k=0; k<width; k++) {
+ /* Analyze position for across-number */
+ /* Left edge non-black followed by non-black */
+ anum = 0;
+ if ( (k==0 && aspace[j][k]!='.' && aspace[j][k+1]!='.') ||
+ /* Previous black - nonblack - nonblack */
+ ( (k+1)<width && (k-1)>=0 && aspace[j][k]!='.'
+ && aspace[j][k-1]=='.'
+ && aspace[j][k+1]!='.' )
+ ){
+ ccount++;
+ anum = ccount;
+ }
+ /* Analyze position for down-number */
+ dnum = 0;
+ /* Top row non-black followed by non-black */
+ if ( (j==0 && aspace[j][k]!='.' && aspace[j+1][k]!='.') ||
+ /* Black above - nonblack - nonblack below */
+ ( (j-1)>=0 && (j+1)<height && aspace[j][k]!='.'
+ && aspace[j-1][k]=='.'
+ && aspace[j+1][k]!='.' )
+ ){
+ /* Don't double number the same space */
+ if (anum == 0) ccount++;
+ dnum = ccount;
+ }
+ /* Now, if necessary, assign some clues and save them. */
+ if (anum != 0) {
+ sprintf(&aclues[apos], "\\Clue{%d}{}{%s}\\\\\n",
+ anum, actext[acount]);
+ acount++;
+ apos = strlen(aclues);
+ }
+ if (dnum != 0) {
+ sprintf(&dclues[dpos], "\\Clue{%d}{}{%s}\\\\\n",
+ dnum, dctext[dcount]);
+ dcount++;
+ dpos = strlen(dclues);
+ }
+ /* Concat the current info to the current row. */
+ strcat(rowtext, "|");
+ if (aspace[j][k] == '.') strcat(rowtext, "*");
+ else {
+ /* see if we need a grid number */
+ if (dnum != 0) {
+ sprintf(tmp, "[%d]", dnum);
+ strcat(rowtext, tmp);
+ }
+ else if (anum != 0) {
+ sprintf(tmp, "[%d]", anum);
+ strcat(rowtext, tmp);
+ }
+ /* Put in solution letter */
+/* this is for real */ if (aspace[j][k]== '&') strncat(rowtext, "\\", 1);
+ strncat(rowtext, &aspace[j][k], 1);
+ }
+ }
+ /* End of the row. Put in marker and output it. */
+ strcat(rowtext, "|.");
+ sprintf(&matrix[mcount], "%s\n", rowtext);
+ mcount = strlen(matrix);
+ }
+ /* That's it for the puzzle. */
+
+ /* Now output the clue section */
+ printf("\\begin{PuzzleClues}{\\textbf{Across}}\\\\\n");
+ for (j=0; j<strlen(aclues); j++){
+ printf("%c",aclues[j]);
+ }
+ printf("\\end{PuzzleClues}\n");
+ printf("\\begin{PuzzleClues}{\\textbf{Down}}\\\\\n");
+ for (j=0; j<strlen(dclues); j++){
+ printf("%c",dclues[j]);
+ }
+ printf("\\end{PuzzleClues}\n");
+
+ /* Now output the diagram */
+ printf("\\newpage\n");
+ printf("\\maketitle\n");
+ printf("\\begin{Puzzle}{%d}{%d}\n", width, height);
+ printf("%s", matrix);
+ printf("\\end{Puzzle}\n");
+
+
+ printf("\\end{document}\n");
+
+ exit(0);
+
+}
+
+ void fgetsa(char *foo, int size, FILE *infile) {
+ int i, oe;
+ fgets(tmp, size, infile);
+ tmp[strlen(tmp)-1] = '\0';
+ strcpy(foo, "\0");
+ oe = 0;
+ for (i=0; i<strlen(tmp); i++) {
+ if (tmp[i]=='$' || tmp[i] == '_' || tmp[i] =='&' || tmp[i] == '#') strcat(foo, "\\");
+ if (tmp[i] == '"') {
+ if (oe == 0) {
+ oe = 1;
+ strcat(foo, "``");
+ }
+ else {
+ oe = 0;
+ strcat(foo, "''");
+ }
+ }
+ else strncat(foo, &tmp[i], 1);
+ }
+ }
+
+
+
+
+
+