Annotation of os2sdk/demos/apps/ds/file.c, revision 1.1.1.1

1.1       root        1: /*  file.c - DS.INI file and path stuff */
                      2: 
                      3: #include <direct.h>
                      4: #include <dos.h>
                      5: #include <stdio.h>
                      6: #include <stdlib.h>
                      7: 
                      8: #include "ds.h"
                      9: #include "vars.h"
                     10: 
                     11: 
                     12: /* External procedures */
                     13: 
                     14: extern newDir (Directory **, char *, Directory *);
                     15: 
                     16: 
                     17: /*  Local variables */
                     18: 
                     19: static char initFile[MAX_PATH_LEN];    /* Initialization file */
                     20: static FILE *iF;                       /* Init file handle */
                     21: 
                     22: static int  i_level;                   /* Directory level */
                     23: static char i_name[FILE_NAME_LEN];     /* Directory name */
                     24: 
                     25: 
                     26: /***   fileInit - initialize file stuff
                     27: *
                     28: *
                     29: */
                     30: fileInit ()
                     31: {
                     32:     char pLastChar;
                     33:     int pLast;
                     34:     char *iPath;
                     35: 
                     36:     RootPath = getcwd (NULL,MAX_PATH_LEN); /* Get current working directory */
                     37:     if (!RootPath) {
                     38:        perror ("\nCouldn't get current working directory");
                     39:        exitError (2);
                     40:     }
                     41:     strcpy (IntRootPath,RootPath);
                     42:     pLast =  strlen(IntRootPath) - 1;  /* Index of last character */
                     43:     pLastChar = IntRootPath[pLast];    /* Last character of root path */
                     44:     if ((pLastChar == '\\') || (pLastChar == '/'))
                     45:        IntRootPath[pLast] = '\0';      /* Get rid of path separator */
                     46: 
                     47:     iPath = getenv (INIT_SYMBOL);
                     48:     if (!iPath) {
                     49:        fprintf (stderr, "\n%s symbol not set in environment.\n",INIT_SYMBOL);
                     50:        fprintf (stderr,
                     51:                 "Put SET %s=drive:path in your AUTOEXEC.BAT.\n",INIT_SYMBOL);
                     52:        exitError (2);
                     53:     }
                     54:     strcpy (initFile,iPath);           /* Copy path */
                     55:     pLast =  strlen(initFile) - 1;     /* Index of last character */
                     56:     pLastChar = initFile[pLast];       /* Last character of root path */
                     57:     if ((pLastChar != '\\') && (pLastChar != '/'))
                     58:        strcat (initFile,"\\");         /* Append path separator */
                     59:     strcat (initFile,INIT_FILE);       /* Append file name and extension */
                     60: }   /* fileInit */
                     61: 
                     62: 
                     63: /***   saveState - save options to init file
                     64: *
                     65: *
                     66: */
                     67: saveState ()
                     68: {
                     69:     int i;
                     70: 
                     71:     iF = fopen (initFile, "w");
                     72:     if (!iF) {
                     73:        fprintf (stderr, "\n%s", initFile);
                     74:        perror ("\nCannot write to initialization file");
                     75:        exitError (2);
                     76:     }
                     77: 
                     78:     fprintf (iF,INIT_FILE_HEADER);
                     79:     for (i=0; i<N_COLORS; i++)
                     80:        fprintf (iF, " %x", color[i]);
                     81:     fprintf (iF, "\n");
                     82: 
                     83:     fprintf (iF, "%s\n", IntRootPath); /* Write out root directory */
                     84:     writeTree (root->d_child, 1);      /* Write out tree */
                     85:     fprintf (iF, "0 The_End\n");       /* Terminate tree */
                     86: 
                     87:     if (fclose (iF) == EOF) {
                     88:        fprintf (stderr,"\nCannot close initialization file");
                     89:        exitError (2);
                     90:     }
                     91: 
                     92:     /* Return to original directory */
                     93: 
                     94:     if (chdir(RootPath) == -1) {
                     95:        fprintf (stderr, "\nDirectory %s", RootPath);
                     96:        perror ("\nCannot change directory");
                     97:        exitError (2);
                     98:     }
                     99: }   /* saveState */
                    100: 
                    101: 
                    102: /***   writeTree - write out directory tree
                    103: *
                    104: *
                    105: */
                    106: writeTree (root, level)
                    107: Directory *root;                /* Root of some subtree */
                    108: int level;                             /* Distance of this root to top root */
                    109: {
                    110:     Directory *p;               /* Used to traverse tree */
                    111: 
                    112:     p = root;
                    113:     while (p)  {                       /* Process directories at this level */
                    114:        writeNode (p,level);            /* Write out node information */
                    115:        if (p->d_child)                 /* Process subtree */
                    116:            writeTree (p->d_child, level+1);
                    117:        p = p->d_next;
                    118:     } /* while */
                    119: }   /* writeTree */
                    120: 
                    121: 
                    122: /***   writeNode - write out a directory node
                    123: *
                    124: *
                    125: */
                    126: writeNode (p, level)
                    127: Directory *p;                   /* Directory node to write out */
                    128: int level;                             /* Distance of this node to top root */
                    129: {
                    130:     fprintf (iF, "%d %s\n", level, p->d_name);
                    131: 
                    132: }   /* writeNode */
                    133: 
                    134: 
                    135: /***   getState - get options from init file
                    136: *
                    137: *      EXIT:   rCode = true, tree WAS read from init file
                    138: *              rCode = false, tree NOT read from init file
                    139: *
                    140: */
                    141: getState ()
                    142: {
                    143:     int i;
                    144:     int rCode;
                    145: 
                    146:     rCode = TRUE;
                    147:     iF = fopen (initFile, "r");
                    148:     if (!iF)                           /* File not opened */
                    149:        return (FALSE);
                    150: 
                    151:     if (fscanf(iF,INIT_FILE_HEADER) == EOF)
                    152:        return (FALSE);
                    153: 
                    154:     for (i=0; i<N_COLORS; i++) {
                    155:        rCode = fscanf(iF, " %x", &color[i]);
                    156:        if (rCode != 1)                 /* Bad data */
                    157:            i = N_COLORS;               /* Exit loop */
                    158:     }
                    159: 
                    160:     if (fscanf(iF,"%s\n", IntRootPath) == EOF)
                    161:        return (FALSE);
                    162: 
                    163:     newDir (&root,IntRootPath,0);      /* Make root node */
                    164:     rCode = readTree (root);
                    165: 
                    166:     if (fclose (iF) == EOF) {
                    167:        fprintf (stderr,"\nCannot close initialization file\n");
                    168:        exitError (2);
                    169:     }
                    170: 
                    171:     return (rCode);
                    172: 
                    173: }   /* getState */
                    174: 
                    175: 
                    176: /***   readTree - read in directory tree
                    177: *
                    178: *      EXIT:   rCode = true, tree WAS read from init file
                    179: *              rCode = false, tree NOT read from init file
                    180: *
                    181: */
                    182: readTree (root)
                    183: Directory *root;                /* Root of some subtree */
                    184: {
                    185:     int level;                         /* Current level */
                    186:     Directory *p;               /* Used to build tree */
                    187:     Directory *n;               /* Used to build tree */
                    188:     int rCode;                         /* Return code */
                    189: 
                    190:     p = root;                          /* Root is parent node */
                    191:     level = 0;                         /* Level of root */
                    192:     if (!readNode())                   /* Failed to read first node */
                    193:        return (FALSE);
                    194: 
                    195:     while (i_level) {
                    196:        if (i_level > level ) {         /* Subtree */
                    197:            level++;                    /* Increase level */
                    198:            newDir (&n, i_name, p);     /* Create new node */
                    199:            p->d_child = n;             /* Point parent to child */
                    200:        }
                    201:        else {                          /* Sibling or higher up tree */
                    202:            while (i_level < level) {   /* Backup, if necessary */
                    203:                level--;                /* Decrease level */
                    204:                p = p->d_parent;        /* Backup to parent */
                    205:            }
                    206:            newDir (&n, i_name, p->d_parent); /* Create new node */
                    207:            p->d_next = n;              /* Point previous to new */
                    208:            n->d_prev = p;              /* Point new to previous */
                    209:        }
                    210:        p = n;                          /* New parent node */
                    211:        if (!readNode())                /* Failed to read next node */
                    212:            return (FALSE);
                    213:     } /* while */
                    214:     return (TRUE);                     /* Read entire tree successfully */
                    215: }   /* readTree */
                    216: 
                    217: 
                    218: /***   readNode - read in a directory node
                    219: *
                    220: *
                    221: */
                    222: readNode ()
                    223: {
                    224:     int rCode;
                    225: 
                    226:     rCode = fscanf (iF, "%d %s\n", &i_level, i_name);
                    227:     if (rCode == 2)                    /* Read succeeded */
                    228:        rCode = TRUE;
                    229:     else                               /* Read failed */
                    230:        rCode = FALSE;
                    231: 
                    232:     return (rCode);                    /* Return status */
                    233: }   /* readNode */

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.