cser.c

Go to the documentation of this file.
00001 /* By Sean Middleditch <elanthis@awemud.net>
00002    released into public domain, July 8th, 2003 */
00003 
00004 #include <stdio.h>
00005 #include <stdlib.h>
00006 #include <string.h>
00007 #include "pvm3.h"
00008 
00009 #include "cser.h"
00010 
00011 /* serialize a string - make it into one line */
00012 int _cser_serialize(FILE* file, const char* value, size_t size) {
00013         size_t last, cur;
00014 
00015         for (cur = last = 0; cur < size; ++cur) {
00016                 /* escape */
00017                 if (value[cur] == '\\' || value[cur] == '\n' || value[cur] == '\0') {
00018                         if (cur > last)
00019                                 fprintf(file, "%.*s", cur - last, &value[last]);
00020                         fprintf(file, "\\%c", value[cur] == '\n' ? 'n' : value[cur] == '\0' ? '0' : value[cur]);
00021                         last = cur + 1;
00022                 }
00023         }
00024 
00025         /* pump out rest of buffer */
00026         if (cur > last)
00027                 fprintf(file, "%.*s", cur - last, &value[last]);
00028 
00029         return 0;
00030 }
00031 
00032 /* write out a string */
00033 int cser_write_str(FILE* file, const char* name, const char* value) {
00034         fprintf(file, "%s=", name);
00035         if (_cser_serialize(file, value, strlen(value)))
00036                 return -1;
00037         fprintf(file, "\n");
00038         return 0;
00039 }
00040 
00041 /* write out a number */
00042 int cser_write_num(FILE* file, const char* name, long num) {
00043         fprintf(file, "%s=%ld\n", name, num);
00044         return 0;
00045 }
00046 
00047 /* read in one line */
00048 int cser_read(FILE* file, char* buffer, size_t blen, char** name, char** str_value, long* num_value) {
00049         size_t bpos = 0, inpos = 0; /* buffer positions */
00050         char inbuf[512]; /* temporary input buffer */
00051         char esc = 0; /* are we in escape mode? */
00052 
00053         /* init */
00054         *name = NULL;
00055         *str_value = NULL;
00056         *num_value = 0;
00057 
00058         /* eof? */
00059         if (feof(file))
00060                 return -1;
00061 
00062         /* loop until eof */
00063         while (fgets(inbuf, sizeof(inbuf), file) != NULL) {
00064                 /* copy line into buffer, undoing escaping as we go */
00065                 for (inpos = 0; inbuf[inpos] != 0 && inbuf[inpos] != '\n'; ++inpos) {
00066                         /* have we any space left in buffer? */
00067                         if (bpos < blen - 1) {
00068                                 /* escaped? */
00069                                 if (esc) {
00070                                         /* determine type */
00071                                         switch(inbuf[inpos]) {
00072                                                 case '\\': buffer[bpos++] = '\\'; break;
00073                                                 case 'n': buffer[bpos++] = '\n'; break;
00074                                                 case '0': buffer[bpos++] = '\0'; break;
00075                                                 default: break; /* just lose the erroneous escape */
00076                                         }
00077                                         esc = 0;
00078                                 } else 
00079                                 /* begin escape? */
00080                                 if (inbuf[inpos] == '\\') {
00081                                         esc = 1;
00082                                 } else
00083                                 /* plain text */
00084                                 {
00085                                         buffer[bpos++] = inbuf[inpos];
00086                                 }
00087                         }
00088                 }
00089 
00090                 /* break on EOL */
00091                 if (inbuf[inpos] == '\n')
00092                         break;
00093         }
00094 
00095         /* NUL terminate buffer */
00096         buffer[bpos] = 0;
00097 
00098         /* find the name/value separator */
00099         *name = buffer;
00100         *str_value = strchr(buffer, '=');
00101 
00102         /* is there a value? */
00103         if (*str_value != NULL) {
00104                 /* break it up properly; NUL terminate name, move forward str value */
00105                 **str_value = 0;
00106                 ++ *str_value;
00107 
00108                 /* make integer version */
00109                 *num_value = atol(*str_value);
00110         }
00111 
00112         return 0;
00113 }
00114 
00115 int cser_pkstr(char *str){
00116         int size = strlen(str)+1;
00117 
00118         pvm_pkint(&size, 1, 1);
00119         pvm_pkbyte(str, size, 1);
00120 
00121         return 0;
00122 }
00123 
00124 char *cser_upkstr() {
00125         int size = -1;
00126 
00127         pvm_upkint(&size, 1, 1);
00128         char *buf = malloc(sizeof(char)*size);
00129         pvm_upkbyte(buf, size, 1);
00130 
00131         return buf;
00132 }
00133 
00134 
00135 
00136 int sendStruct(int tid, int tag, void *dataStruct, packData_t *packer) {
00137         pvm_initsend(PvmDataDefault);
00138         packer(dataStruct);
00139         pvm_send(tid, tag);
00140         
00141         return 0;
00142 }
00143 
00144 int mcastStruct(int *tids, int tidListSize, int tag, void *dataStruct, packData_t *packer) {
00145         pvm_initsend(PvmDataDefault);
00146         packer(dataStruct);
00147         pvm_mcast(tids, tidListSize, tag);
00148         
00149         return 0;
00150 }
00151 
00152 void *recvStruct(int tid, int tag, unpackData_t *unpacker){ 
00153         pvm_recv(tid, tag);
00154         
00155         return unpacker();
00156 }
00157 

Generated on Tue Jan 17 19:18:37 2006 for Void by  doxygen 1.4.6