int main() { void *i = #define CALL i = 0, func(&i) create_macro(); #undef CALL void *j = #define CALL j = 0, func(&j) create_macro(&i); #undef CALL void *k = #define CALL k = 0, func(&k) create_macro() + 0x42; void *l = (l = 0, func(&l), l) + 0x42; //string _var(tmp)(new(string)); //string _var(tmp)(); /////////////////////////////// //string _var(tmp) + new(string); //string _var(tmp); }
int add_macros( pmtoken current_token, pmmacro first_macro ) { pmmacro current_macro, scan_macro; current_macro = first_macro; while (current_token) { if (current_token->state == SLABEL_OR_MACRO) { if (current_token->next->state == SMACRO) { /* We have a new macro ! */ if (strcmp(current_token->next->text, "MACRO")) { record_error("malformed macro line"); } else { /* Add current_token to macro list */ current_macro = create_macro( current_token, current_macro ); } } } current_token = current_token->next; } }
/* Get user's macros */ void get_macros(UR_OBJECT user) { FILE *fp; int l_len=(MC_NAME_LEN+MC_COM_LEN+2); MC_OBJECT mc; char fname[FNAME_LEN], line[ARR_SIZE*2]; set_crash(); #ifdef NETLINKS if (user->type==REMOTE_TYPE) return; #endif sprintf(fname,"%s/%s.MAC",USERMACROS,user->name); if ((fp=fopen(fname, "r"))==NULL) return; fgets(line, l_len, fp); while (!feof(fp)) { line[strlen(line)-1]='\0'; if ((mc=create_macro())==NULL) { fclose(fp); return; } if (user->first_macro==NULL) { user->first_macro=mc; mc->prev=NULL; } else { user->last_macro->next=mc; mc->prev=user->last_macro; } mc->next=NULL; user->last_macro=mc; sscanf(line, "%s ", mc->name); strcpy(mc->comstr, remove_first(line)); fgets(line, l_len, fp); } fclose(fp); }
void qrealtime_macro(void) { create_macro(macro_name,TRUE); }
void qstart_macro(void) { create_macro(macro_name,FALSE); }
/*** Manipulacia s makrami ***/ void macros(UR_OBJECT user, char *inpstr) { MC_OBJECT mc; char *p, *n, *c; int i; set_crash(); #ifdef NETLINKS if (user->type==REMOTE_TYPE) { write_user(user,"Due to software limitations, remote users cannot have macros.\n"); return; } #endif if (word_count<2) { show_macros(user); return; } p=inpstr; i=0; while (*p!='=' && *p) { if (!isalpha(*p)) { if (i!=0 || (i==0 && *p!='.')) { vwrite_user(user, "V nazve mozes mat len pismena ! - %c\n", *p); return; } } p++; i++; } if (*p!='=') { write_user(user, "Pozri si radsej najprv help ...\n"); return; } c=(p+1); if (strlen(c)>MC_COM_LEN) { write_user(user, "Pridlhe rozvinutie makra\n"); return; } if (i>MC_NAME_LEN) { write_user(user, "Pridlhy nazov makra\n"); return; } if (c[0]=='\0') { for (mc=user->first_macro; mc!=NULL; mc=mc->next) { if (!strncmp(mc->name, word[1], i)) { delete_macro(user, mc); write_user(user, "Makro bolo vymazane\n"); save_macros(user); return; } } write_user(user, "Nezadane rozvinutie makra !\n"); return; } if ((n=(char *)malloc(MC_NAME_LEN+1))==NULL) { write_syslog(ERRLOG, 1, "chyba alokacie pamate v macros()\n"); write_user(user, "~FRSYSTEM: chyba alokacie pamate\n"); return; } strncpy(n, word[1], i); n[i]='\0'; for (mc=user->first_macro; mc!=NULL; mc=mc->next) { if (!strcmp(mc->name, n)) break; } if (mc!=NULL) { strcpy(mc->comstr, c); write_user(user, "Makro bolo zmenene\n"); save_macros(user); free(n); return; } if ((mc=create_macro())==NULL) { write_syslog(ERRLOG, 1, "chyba alokacie pamate v macros()\n"); write_user(user, "~FRSYSTEM: ~RSchyba alokacie pamate\n"); free(n); return; } strcpy(mc->name, n); strcpy(mc->comstr, c); if (user->first_macro==NULL) { user->first_macro=mc; mc->prev=NULL; } else { user->last_macro->next=mc; mc->prev=user->last_macro; } mc->next=NULL; user->last_macro=mc; save_macros(user); write_user(user, "Makro bolo pridane\n"); free(n); }