예제 #1
0
bool graph_miner_mpi_dyn::can_split_work(){

  //This will prevent splitting work beyond the first level (single edge)
  //if(task_split_level == 0 && dfs_task_queue[task_split_level].size() == 0)
  //return false;

  if(!working())
    return false;

  //prevents giving work until regeneration is complete
  //if(embeddings_regeneration_level > 0)
  //	return false;

  task_split_level = 0;
  //while(dfs_task_queue[task_split_level].size() < task_split_threshold && task_split_level < dfs_task_queue.size() ){
  while(dfs_task_queue[task_split_level].size() < task_split_threshold && task_split_level < current_dfs_level ) {
    task_split_level++;
    DEBUG(*(graph_miner::logger), "task split level changed = " << task_split_level << " queue size = " << dfs_task_queue[task_split_level].size());
  }

  if(dfs_task_queue[task_split_level].size() >= task_split_threshold)
    return true;

  return false;
}
예제 #2
0
int main()
{
    fgets (input, 256, stdin);
    end = strlen(input);
    working();
    return 0;
}
예제 #3
0
void
FileGathererThread::run()
{
    for (;;) {
        
        {
            WorkingSetter working( _imp.get() );
            
            if ( _imp->checkForExit() ) {
                return;
            }
            
            {
                QMutexLocker k(&_imp->requestedDirMutex);
                _imp->itemBeingFetched = _imp->requestedItem;
            }
            
            ///Doesn't need to be protected under requestedDirMutex since it is written to only by this thread
            gatheringKernel(_imp->itemBeingFetched);
            _imp->itemBeingFetched.reset();
            
        } //WorkingSetter
        
        _imp->checkForAbort();
        
        {
            QMutexLocker l(&_imp->startCountMutex);
            while (_imp->startCount <= 0) {
                _imp->startCountCond.wait(&_imp->startCountMutex);
            }
            _imp->startCount = 0;
        }
        
    }
}
예제 #4
0
파일: 2.c 프로젝트: one-eye-bob/OS2-Lab
int monitoring(){
	int forkPID;
	bool useCheckpoint = false;

	//Keep monitoring forever until the worker succeeds
	while(1){
		//Create a worker only if we didnt create a checkpoint
		if(!useCheckpoint){
			if((forkPID = fork()) < 0){
				perror("Error: fork couldn't create a child!");
				//Loop again
				continue;
			}
		}
		
		//Check if this process is the worker
		if(forkPID == 0)
			//Start the worker from scrach
			working();
		else {
			//Reserved for the status of the worker after it was terminated
			int status;

			int waitPID;
			do {
				//printf("Monitor: Waiting before making a checkpoint!\n");
				usleep(cpInterval*1000000);
				//printf("Monitor: Sending a siganl to make a checkpoint!\n");
				//time to send dump request
				kill(forkPID, SIGUSR1);
				//printf("Monitor: waiting for the worker to respond!\n");
				waitPID = waitpid((pid_t)forkPID, &status, WNOHANG);
			//wait again if the process was interrupted by alarm
			} while (waitPID == 0);
			
			//Wait for the worker until it terminates
			//waitPID = waitpid((pid_t)forkPID, &status, 0);

			if(waitPID < 0)
				perror("Error: waitpid couldn't let the monitor wait until the worker has finished");
			else if(WIFEXITED(status))
				if(WEXITSTATUS(status)){
					//Monitor: This worker failed
					//Set CRIU options before restoring the last safe state
					setCriuOptions();

					//Restore the worker from last safe state
					if((forkPID = criu_restore_child()) < 0) {
						perror("Error: criu_restore_child failed to restore child!\n");
					}else{
						printf("Successfully restored child with pid: %d\n", forkPID);
						useCheckpoint = true;
					}
				} else {
					//Monitor: The worker succeeded!
					exit(0);
				}
		}
	}
}
예제 #5
0
boost::optional<Quantity> QuantityConverterSingleton::convert(const Quantity &original,
                                                              const Unit& targetUnits) const
{
  Quantity working(original);
  OptionalQuantity candidate;

  // See if nothing to be done. (Check for equality of system and base units + exponents.)
  if ((working.system() == targetUnits.system()) && (working.units() == targetUnits))
  {
    // Assume targetUnits has desired scale.
    working.setScale(targetUnits.scale().exponent);
    return working;
  }

  // All conversions go through SI
  if (working.system() != UnitSystem::SI) {
    candidate = m_convertToSI(working);
    if (!candidate) {
      return boost::none;
    }
    working = *candidate;
  }

  // Retain pretty string
  OptionalQuantity result = m_convertToTargetFromSI(working,targetUnits);
  if (result && 
      result->prettyUnitsString(false).empty() && 
      !targetUnits.prettyString(false).empty()) 
  {
    result->setPrettyUnitsString(targetUnits.prettyString(false));
  }

  return result;
}
예제 #6
0
파일: m_fido.c 프로젝트: bbs-io/mbse
void CloseFidonet(int force)
{
	char	fin[PATH_MAX], fout[PATH_MAX], temp[10];
	FILE	*fi, *fo;
	st_list	*fid = NULL, *tmp;

	snprintf(fin,  PATH_MAX, "%s/etc/fidonet.data", getenv("MBSE_ROOT"));
	snprintf(fout, PATH_MAX, "%s/etc/fidonet.temp", getenv("MBSE_ROOT"));

	if (FidoUpdated == 1) {
		if (force || (yes_no((char *)"Database is changed, save changes") == 1)) {
			working(1, 0, 0);
			exp_golded = TRUE;
			fi = fopen(fout, "r");
			fo = fopen(fin, "w");
			fread(&fidonethdr, fidonethdr.hdrsize, 1, fi);
			fwrite(&fidonethdr, fidonethdr.hdrsize, 1, fo);

			while (fread(&fidonet, fidonethdr.recsize, 1, fi) == 1)
				if (!fidonet.deleted) {
					snprintf(temp, 10, "%05d", fidonet.zone[0]);
					fill_stlist(&fid, temp, ftell(fi) - fidonethdr.recsize);
				}
			sort_stlist(&fid);

			for (tmp = fid; tmp; tmp = tmp->next) {
				fseek(fi, tmp->pos, SEEK_SET);
				fread(&fidonet, fidonethdr.recsize, 1, fi);
				fwrite(&fidonet, fidonethdr.recsize, 1, fo);
			}

			fclose(fi);
			fclose(fo);
			unlink(fout);
			tidy_stlist(&fid);
			chmod(fin, 0640);

			Syslog('+', "Updated \"fidonet.data\"");
			if (!force)
			    working(6, 0, 0);
			return;
		}
	}
	chmod(fin, 0640);
	working(1, 0, 0);
	unlink(fout); 
}
예제 #7
0
파일: m_mgroup.c 프로젝트: bbs-io/mbse
void CloseMGroup(int force)
{
    char    fin[PATH_MAX], fout[PATH_MAX];
    FILE    *fi, *fo;
    st_list *mgr = NULL, *tmp;

    free(gedgrps);
    snprintf(fin,  PATH_MAX, "%s/etc/mgroups.data", getenv("MBSE_ROOT"));
    snprintf(fout, PATH_MAX, "%s/etc/mgroups.temp", getenv("MBSE_ROOT"));

    if (MGrpUpdated == 1) {
	if (force || (yes_no((char *)"Database is changed, save changes") == 1)) {
	    working(1, 0, 0);
	    fi = fopen(fout, "r");
	    fo = fopen(fin,  "w");
	    fread(&mgrouphdr, mgrouphdr.hdrsize, 1, fi);
	    fwrite(&mgrouphdr, mgrouphdr.hdrsize, 1, fo);

	    while (fread(&mgroup, mgrouphdr.recsize, 1, fi) == 1)
		if (!mgroup.Deleted)
		    fill_stlist(&mgr, mgroup.Name, ftell(fi) - mgrouphdr.recsize);
	    sort_stlist(&mgr);

	    for (tmp = mgr; tmp; tmp = tmp->next) {
	        fseek(fi, tmp->pos, SEEK_SET);
	        fread(&mgroup, mgrouphdr.recsize, 1, fi);
	        fwrite(&mgroup, mgrouphdr.recsize, 1, fo);
	    }

	    tidy_stlist(&mgr);
	    fclose(fi);
	    fclose(fo);
	    unlink(fout);
	    chmod(fin, 0660);
	    disk_reset();
	    Syslog('+', "Updated \"mgroups.data\"");
	    if (!force)
	        working(6, 0, 0);
	    exp_golded = TRUE;
	    return;
	}
    }
    chmod(fin, 0660);
    working(1, 0, 0);
    unlink(fout); 
}
예제 #8
0
파일: m_hatch.c 프로젝트: bbs-io/mbse
void CloseHatch(int force)
{
	char	fin[PATH_MAX], fout[PATH_MAX];
	FILE	*fi, *fo;
	st_list	*hat = NULL, *tmp;

	snprintf(fin,  PATH_MAX, "%s/etc/hatch.data", getenv("MBSE_ROOT"));
	snprintf(fout, PATH_MAX, "%s/etc/hatch.temp", getenv("MBSE_ROOT"));

	if (HatchUpdated == 1) {
		if (force || (yes_no((char *)"Database is changed, save changes") == 1)) {
			working(1, 0, 0);
			fi = fopen(fout, "r");
			fo = fopen(fin,  "w");
			fread(&hatchhdr, hatchhdr.hdrsize, 1, fi);
			fwrite(&hatchhdr, hatchhdr.hdrsize, 1, fo);

			while (fread(&hatch, hatchhdr.recsize, 1, fi) == 1)
				if (!hatch.Deleted)
					fill_stlist(&hat, hatch.Spec, ftell(fi) - hatchhdr.recsize);
			sort_stlist(&hat);

			for (tmp = hat; tmp; tmp = tmp->next) {
				fseek(fi, tmp->pos, SEEK_SET);
				fread(&hatch, hatchhdr.recsize, 1, fi);
				fwrite(&hatch, hatchhdr.recsize, 1, fo);
			}

			tidy_stlist(&hat);
			fclose(fi);
			fclose(fo);
			unlink(fout);
			chmod(fin, 0640);
			disk_reset();
			Syslog('+', "Updated \"hatch.data\"");
			if (!force)
			    working(6, 0, 0);
			return;
		}
	}
	chmod(fin, 0640);
	working(1, 0, 0);
	unlink(fout); 
}
예제 #9
0
파일: m_magic.c 프로젝트: ftnapps/FTNd
void CloseMagics(int force)
{
	char	fin[PATH_MAX], fout[PATH_MAX];
	FILE	*fi, *fo;
	st_list	*mag = NULL, *tmp;

	snprintf(fin,  PATH_MAX, "%s/etc/magic.data", getenv("FTND_ROOT"));
	snprintf(fout, PATH_MAX, "%s/etc/magic.temp", getenv("FTND_ROOT"));

	if (MagicUpdated == 1) {
		if (force || (yes_no((char *)"Database is changed, save changes") == 1)) {
			working(1, 0, 0);
			fi = fopen(fout, "r");
			fo = fopen(fin,  "w");
			fread(&magichdr, magichdr.hdrsize, 1, fi);
			fwrite(&magichdr, magichdr.hdrsize, 1, fo);

			while (fread(&magic, magichdr.recsize, 1, fi) == 1)
				if (!magic.Deleted)
					fill_stlist(&mag, magic.Mask, ftell(fi) - magichdr.recsize);
			sort_stlist(&mag);

			for (tmp = mag; tmp; tmp = tmp->next) {
				fseek(fi, tmp->pos, SEEK_SET);
				fread(&magic, magichdr.recsize, 1, fi);
				fwrite(&magic, magichdr.recsize, 1, fo);
			}

			fclose(fi);
			fclose(fo);
			tidy_stlist(&mag);
			unlink(fout);
			chmod(fin, 0640);
			disk_reset();
			Syslog('+', "Updated \"magic.data\"");
			if (!force)
			    working(6, 0, 0);
			return;
		}
	}
	chmod(fin, 0640);
	working(1, 0, 0);
	unlink(fout); 
}
예제 #10
0
파일: m_ibc.c 프로젝트: ftnapps/FTNd
void CloseIBC(int force)
{
    char	fin[PATH_MAX], fout[PATH_MAX];
    FILE	*fi, *fo;
    st_list	*vir = NULL, *tmp;

    snprintf(fin,  PATH_MAX, "%s/etc/ibcsrv.data", getenv("FTND_ROOT"));
    snprintf(fout, PATH_MAX, "%s/etc/ibcsrv.temp", getenv("FTND_ROOT"));

    if (IBCUpdated == 1) {
        if (force || (yes_no((char *)"Database is changed, save changes") == 1)) {
            working(1, 0, 0);
            fi = fopen(fout, "r");
            fo = fopen(fin,  "w");
            fread(&ibcsrvhdr, ibcsrvhdr.hdrsize, 1, fi);
            fwrite(&ibcsrvhdr, ibcsrvhdr.hdrsize, 1, fo);

            while (fread(&ibcsrv, ibcsrvhdr.recsize, 1, fi) == 1)
                if (!ibcsrv.Deleted)
                    fill_stlist(&vir, ibcsrv.comment, ftell(fi) - ibcsrvhdr.recsize);
            sort_stlist(&vir);

            for (tmp = vir; tmp; tmp = tmp->next) {
                fseek(fi, tmp->pos, SEEK_SET);
                fread(&ibcsrv, ibcsrvhdr.recsize, 1, fi);
                fwrite(&ibcsrv, ibcsrvhdr.recsize, 1, fo);
            }

            tidy_stlist(&vir);
            fclose(fi);
            fclose(fo);
            unlink(fout);
            chmod(fin, 0640);
            Syslog('+', "Updated \"ibcsrv.data\"");
            if (!force)
                working(6, 0, 0);
            return;
        }
    }
    chmod(fin, 0640);
    unlink(fout);
}
예제 #11
0
void working()
{
    int tmp;
    for ( ; i < end; i++)
        switch ( input[i] )
        {
            case '>' : p = plus(p); break;
            case '<' : p = minus(p); break;
            case '|' : p = 0; break;
            case ',' : scanf("%d",&tmp ); tape[p] = tmp; break;
            case '.' : printf("%u\n", tape[p]); break;
            case '=' : tape[p] = tape[ minus(p) ]; break;
            case '0' : tape[p] = 0; break;
            case '!' : var = tape[p]; break;
            case '?' : tape[p] = var; break;
            case '*' : tape[p] = ( tape[p] * tape[minus(p)] ) % 256; break;
            case '/' : tape[p] = tape[p] / tape[minus(p)]; break;
            case '+' : tape[p] = (tape[p]==255)?0:(tape[p]+1); break;
            case '-' : tape[p] = (!tape[p])?0:(tape[p]-1); break;
            case '^' : printf("%d", var); break;
            case '$' : var = p;
            case '(' :
                if (!tape[p])
                {
                    tmp = 1;
                    for (i++; tmp; i++)
                        if (input[i]=='(') tmp++;
                        else if (input[i]==')') tmp--;
                    i--;
                }
                break;
            case '[' :
                if ( !tape[p] )
                {
                    tmp = 1;
                    for (i++; tmp; i++)
                        if (input[i]=='[') tmp++;
                        else if (input[i]==']') tmp--;
                    i--;
                }
                else
                {
                    i++;
                    tmp = i;
                    do {
                        i = tmp;
                        working();
                    } while ( tape[p] );
                }
                break;
            case ']' : return;
        }
}
예제 #12
0
파일: m_mgroup.c 프로젝트: bbs-io/mbse
int CheckMgroup(void)
{
	int	ncnt, mcnt;

	working(1, 0, 0);
	ncnt = GroupInNode(mgroup.Name, TRUE);
	mcnt = GroupInMarea(mgroup.Name);
	if (ncnt || mcnt) {
		errmsg((char *)"Error, %d node(s) and/or %d message area(s) connected", ncnt, mcnt);
		return TRUE;
	}
	return FALSE;
}
예제 #13
0
파일: m_ol.c 프로젝트: ftnapps/FTNd
void CloseOneline(int force)
{
	char	fin[PATH_MAX], fout[PATH_MAX];

	snprintf(fin,  PATH_MAX, "%s/etc/oneline.data", getenv("FTND_ROOT"));
	snprintf(fout, PATH_MAX, "%s/etc/oneline.temp", getenv("FTND_ROOT"));

	if (OnelUpdated == 1) {
		if (force || (yes_no((char *)"Database is changed, save changes") == 1)) {
			working(1, 0, 0);
			if ((rename(fout, fin)) == 0)
				unlink(fout);
			chmod(fin, 0660);
			Syslog('+', "Updated \"oneline.data\"");
			if (!force)
			    working(6, 0, 0);
			return;
		}
	}
	chmod(fin, 0660);
	working(1, 0, 0);
	unlink(fout); 
}
예제 #14
0
void FileTestContext::workingFileFromTemplate(
   const char* templateName,     ///< testInputDir file
   TemplateConverter* converter, ///< conversion function
   const char* filename          ///< testWorkingDir file
                                               )
{
   /*
    * The template in the testInputDir and the filename in testWorkingDir are opened,
    * and then both files are passed to the converter.
    *
    * The converter is responsible for reading the template and writing the filename.
    *
    * If no filename is supplied, its name is the same as the templateName.
    */
   CPPUNIT_ASSERT(templateName != NULL);
   CPPUNIT_ASSERT(converter != NULL);

   // Open the template file
   UtlString templatePath;
   inputFilePath(templateName, templatePath);
   OsPath input(templatePath);
   OsFile inputFile(input);

   CPPUNIT_ASSERT_EQUAL(OS_SUCCESS, inputFile.open(OsFile::READ_ONLY));

   // Create/open the registration DB file.
   UtlString workingPath;
   workingFilePath(filename ? filename : templateName, workingPath);
   OsPath working(workingPath);
   OsFile workingFile(working);
   CPPUNIT_ASSERT_EQUAL(OS_SUCCESS, workingFile.open(OsFile::CREATE));

   // Let the converter convert the files
   converter(&inputFile, &workingFile);

   CPPUNIT_ASSERT_EQUAL(OS_SUCCESS, workingFile.flush());

   Os::Logger::instance().log(FAC_UNIT_TEST, PRI_NOTICE, "FileTestContext::workingFileFromTemplate '%s' -> '%s'",
                 templateName, workingPath.data());

   inputFile.close();
   workingFile.close();
}
예제 #15
0
파일: ftnsetup.c 프로젝트: ftnapps/FTNd
void initdatabases(void)
{
    if (!init) {
	clr_index();
	working(1, 0, 0);
	set_color(WHITE, BLACK);
	ftnd_mvprintw( 5, 6, "     INIT DATABASES");
	IsDoing("Init Databases");
    }

    config_read();

    InitArchive();
    InitDomain();
    InitFilearea();
    InitFilefind();
    InitFGroup();
    InitFidonetdb();
    InitFidonet();
    InitHatch();
    InitLanguage();
    InitLimits();
    InitMagics();
    InitMsgarea();
    InitMGroup();
    InitModem();
    InitNewfiles();
    InitNGroup();
    InitNodes();
    InitOneline();
    InitProtocol();
    InitService();
    InitTicarea();
    InitTtyinfo();
    InitUsers();
    InitVirus();
    InitRoute();
    InitFDB();
    InitIBC();
    if (!init) {
	clr_index();
    }
}
예제 #16
0
 boost::optional<double> ScheduleBase_Impl::toDouble(const Quantity& quantity) const {
   OptionalDouble result;
   OptionalQuantity working(quantity);
   if (OptionalScheduleTypeLimits scheduleTypeLimits = this->scheduleTypeLimits()) {
     if (OptionalUnit siUnits = ScheduleTypeLimits::units(scheduleTypeLimits->unitType(),false)) {
       if (siUnits) {
         if (working->units() == *siUnits) {
           working->setScale(siUnits->scale().exponent);
         }
         else {
           working = convert(*working,*siUnits);
         }
         if (working) {
           result = working->value();
         }
       }
     }
   }
   return result;
 }
예제 #17
0
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    inforWin = new QTextEdit(this);
    debugWin = new QPlainTextEdit();
    debugWin2 = new QPlainTextEdit();
    debugWin->setWindowTitle("receive window");
    debugWin2->setWindowTitle("post window");
    //inforWin->setDisabled(true);
    //debugWin->setDisabled(true);
    setCentralWidget(inforWin);
    QMenu *testMenu = menuBar()->addMenu(tr("&Tools"));
    QMenu *test2Menu = menuBar()->addMenu(tr("&Tools2"));
    test2Menu->addAction(myTr("set timeout"), this, SLOT(setTimeout()));
    test2Menu->addAction(tr("settings"), this, SLOT(inputdata()));


    testMenu->addAction(myTr("登陆"), this, SLOT(loginsis()));
    testMenu->addAction(myTr("load thread from internet"), this, SLOT(loadthreadfromeinternet()));
    testMenu->addAction(myTr("working"), this, SLOT(working()));
    testMenu->addAction(myTr("catalog"), this, SLOT(generateCatalog()));



#define DEBUG_MODE
#ifdef DEBUG_MODE
    testMenu->addAction(myTr("load thread from file and checking"), this, SLOT(loadthreadfromfileandchecking()));
    testMenu->addAction(myTr("fixPoster"), this, SLOT(fixPoster()));

    testMenu->addAction(myTr("test"), this, SLOT(test4()));
    testMenu->addAction(myTr("fanye"), this, SLOT(fanye()));
    testMenu->addAction(myTr("robfloor"), this, SLOT(robfloor()));
    testMenu->addAction(myTr("clear cookie"), this, SLOT(clearCookie()));
    testMenu->addAction(myTr("签到"), this, SLOT(registersis()));
    //connect(nam, SIGNAL(finished(QNetworkReply*)),  this, SLOT(replyFinished(QNetworkReply*)));

    test2Menu->addAction(myTr("toggle internet mode"), this, SLOT(togglenet()));
#endif
}
예제 #18
0
void FileTestContext::inputFile(const char* filename)
{
   UtlString inputPath;
   inputFilePath(filename, inputPath);

   UtlString workingPath;
   workingFilePath(filename, workingPath);

   OsPath input(inputPath);
   OsPath working(workingPath);

   OsPath workingDirPath(working.getDirName());
   workingDirPath.strip(UtlString::trailing, OsPath::separator(0));
   OsDir workingDir(workingDirPath);

   if (!workingDir.exists())
   {
      UtlString msg;
      msg.append("FileTestContext::inputFile failed to create working directory '");
      msg.append(working.getDirName().data());
      msg.append("'");
      CPPUNIT_ASSERT_EQUAL_MESSAGE(msg.data(),
                                   OS_SUCCESS,OsFileSystem::createDir(workingDirPath,TRUE));
   }

   UtlString msg;
   msg.append("FileTestContext::inputFile copy failed from '");
   msg.append(inputPath);
   msg.append("' -> '");
   msg.append(workingPath);
   msg.append("'");
   CPPUNIT_ASSERT_EQUAL_MESSAGE(msg.data(),
                                OS_SUCCESS,
                                OsFileSystem::copy(input, working)
                                );

   Os::Logger::instance().log(FAC_UNIT_TEST, PRI_NOTICE, "FileTestContext::inputFile '%s' -> '%s'",
                 inputPath.data(), workingPath.data());

}
예제 #19
0
파일: Working.c 프로젝트: ejoonie/mutex
void *server(int server_priority)
{
	int rcvid, status;

	char myRMessage[BUFSIZE];
	struct _msg_info my_msg_info;

	pid = getpid();
	chid = ChannelCreate(NULL);
	if (chid == -1) {
		perror("error creating a channel\n");
		exit(EXIT_FAILURE);
	}

	printf("the server started with pid: %d, chid: %d, priority: %d"
			, pid, chid, server_priority);

	while(1)
	{
		rcvid = MsgReceive(chid, myRMessage, BUFSIZE, &my_msg_info);

		printf("the server received message from %d with priority %d\n",my_msg_info.tid, my_msg_info.priority);

		printf("before server working for %d", my_msg_info.tid);
		working(my_msg_info.tid);
		printf("after server working for %d", my_msg_info.tid);

		status = MsgReply(rcvid, 0, NULL, 0);
		if (status == -1)
		{
			perror("error in reply\n");
			exit(EXIT_FAILURE);
		}

		printf("the server replied to %d.\n", my_msg_info);
	}


	return;
}
예제 #20
0
bool utfConvert(
    const std::basic_string<From>& from, std::basic_string<To>& to,
    ConversionResult(*cvtfunc)(const typename FromTrait::ArgType**, const typename FromTrait::ArgType*,
        typename ToTrait::ArgType**, typename ToTrait::ArgType*,
        ConversionFlags)
    )
{
    static_assert(sizeof(From) == sizeof(typename FromTrait::ArgType), "Error size mismatched");
    static_assert(sizeof(To) == sizeof(typename ToTrait::ArgType), "Error size mismatched");

    if (from.empty())
    {
        to.clear();
        return true;
    }

    // See: http://unicode.org/faq/utf_bom.html#gen6
    static const int most_bytes_per_character = 4;

    const size_t maxNumberOfChars = from.length(); // all UTFs at most one element represents one character.
    const size_t numberOfOut = maxNumberOfChars * most_bytes_per_character / sizeof(To);

    std::basic_string<To> working(numberOfOut, 0);

    auto inbeg = reinterpret_cast<const typename FromTrait::ArgType*>(&from[0]);
    auto inend = inbeg + from.length();


    auto outbeg = reinterpret_cast<typename ToTrait::ArgType*>(&working[0]);
    auto outend = outbeg + working.length();
    auto r = cvtfunc(&inbeg, inend, &outbeg, outend, strictConversion);
    if (r != conversionOK)
        return false;

    working.resize(reinterpret_cast<To*>(outbeg) - &working[0]);
    to = std::move(working);

    return true;
};
예제 #21
0
void CShareManager::run()
{
	while(true)	{
		{
			QMutexLocker l(&taskListmutex_);
			while( !umountAll_ && taskList_.isEmpty() )
				cond_.wait(&taskListmutex_);
		}
		if(umountAll_)	{
			umountAllImpl();
			return;
		}
		started_ = false;
		while(!taskList_.empty())	{
			if(!started_)	{
				emit working();
				started_ = true;
			}
			QPair<ETask, QSharedPointer<SShare> > task;
			{
				QMutexLocker l(&taskListmutex_);
				task = taskList_.front();
				taskList_.pop_front();
			}
			switch(task.first)	{
			case Mount:				mount(task.second);				break;
			case MountAutoShare:		mountAutoShare(task.second);	break;
			case Umount:				umount(task.second);			break;
			case MakePath:			makePath(task.second);			break;
			case DestroyPath:		destroyPath(task.second);		break;
			default:	break;
			}
		}
		if(started_)	{
			started_ = false;
			emit done();
		}
	}
}
예제 #22
0
boost::optional<Quantity> QuantityConverterSingleton::m_convertToTargetFromSI(
    const Quantity& original,const Unit& targetUnits) const
{
  Quantity working(original);

  // Make sure to work unscaled: 10^0
  if (working.scale().exponent != 0) {
    working.setScale(0);
  }
  Quantity converted(working.value(),targetUnits.system());

  if ((working.units() == targetUnits) &&
      (working.system() == targetUnits.system()))
  {
    converted = working;
  }
  else {
    // Get the base units of targetUnits
    std::vector<std::string> baseOfTarget = targetUnits.baseUnits();
    // Loop over base units in original and apply (inverse of) conversions in m_toSImap
    std::vector<std::string>::const_iterator it = baseOfTarget.begin();
    std::vector<std::string>::const_iterator end = baseOfTarget.end();
    while( it != end ) {
      int baseExponent = targetUnits.baseUnitExponent(*it);
      // apply conversion factor
      BaseUnitConversionMap::const_iterator mapItr = m_toSImap.find(*it);
      if (mapItr == m_toSImap.end()) {
        LOG(Error,"Cannot convert to a target Unit containing base unit '" << *it
            << "', because it is not registered with the QuantityConverter.");
        return boost::none;
      }
      baseUnitConversionFactor factor = m_toSImap.find(*it)->second;
      if (factor.offset != 0.0) {
        for( int i = 0; i < std::abs(baseExponent); ++i) {
          if( baseExponent > 0 ){
            converted.setValue( (converted.value() - factor.offset) / factor.factor);
          }else {
            converted.setValue( (converted.value() - factor.offset) * factor.factor);
          }
        }
      }
      else {
        converted.setValue( converted.value() * std::pow(factor.factor,-baseExponent) );
      }
      // Set units in converted
      converted.setBaseUnitExponent(*it,
                                    converted.baseUnitExponent(*it) + baseExponent);
      // Monitor left over units in working
      // Parse the conversion string in case the target converts to more than one SI base unit
      Unit sourceBase = parseUnitString(factor.targetUnit);
      std::vector<std::string> sourceStrings = sourceBase.baseUnits();
      std::vector<std::string>::const_iterator sourceItr = sourceStrings.begin();
      std::vector<std::string>::const_iterator sourceEnd = sourceStrings.end();
      while( sourceItr != sourceEnd ) {
        int exp = sourceBase.baseUnitExponent( *sourceItr );
        if( exp != 0 ) {
          working.setBaseUnitExponent(*sourceItr,
                                      working.baseUnitExponent(*sourceItr) - baseExponent*exp);
        }
        ++sourceItr;
      } // end while( sourceItr != sourceEnd )
      ++it;
    }

    if (!working.standardUnitsString().empty()) {
      LOG(Error,"Could not convert " << original << " to " << targetUnits
          << ". Have " << working.standardUnitsString() << "left over.");
      return boost::none;
    }
  }

  // Set result scale to match targetUnits scale
  if (targetUnits.scale().exponent != 0) {
    converted.setScale(targetUnits.scale().exponent);
  }

  // Check if there is a pretty string for the result
  std::string pretty = UnitFactory::instance().lookupPrettyString(
    converted.standardUnitsString(false) );
  if( !(pretty.empty()) ) {
    converted.setPrettyUnitsString( pretty );
  }

  return converted;
}
예제 #23
0
Quantity QuantityConverterSingleton::m_convertFromSI(const Quantity &original,
                                                     const UnitSystem targetSys) const
{
  Quantity working(original);

  // Make sure to work unscaled: 10^0
  int scaleExponent = working.scale().exponent;
  if (working.scale().exponent != 0) {
    working.setScale(0);
  }
  Quantity converted(working.value(),targetSys);

  UnitSystemConversionMultiMap::const_iterator factorItr;
  // m_fromSImap is a multi-map, so get the range of values that match the key 'targetSys'
  std::pair<UnitSystemConversionMultiMap::const_iterator, UnitSystemConversionMultiMap::const_iterator> systemFactors;
  systemFactors = m_fromSIBySystemMap.equal_range( targetSys );
  for( factorItr = systemFactors.first; factorItr != systemFactors.second; ++factorItr) {
    baseUnitConversionFactor fromFactor = (*factorItr).second;
    int workingExp = working.baseUnitExponent(fromFactor.originalUnit);
    if (fromFactor.offset != 0.0) {
      for( int i=0; i < std::abs(workingExp); ++i ) {
        if( workingExp > 0 ) {
          converted.setValue( (converted.value() * fromFactor.factor) + fromFactor.offset );
        }
        else {
          converted.setValue( (converted.value() / fromFactor.factor) + fromFactor.offset );
        }
      }
    }
    else {
      converted.setValue(converted.value() * std::pow(fromFactor.factor,workingExp) );
    }
    // Parse the conversion string incase the SI unit converts to more than one target base unit
    Unit targetBase = parseUnitString(fromFactor.targetUnit);
    std::vector<std::string> targetStrings = targetBase.baseUnits();
    std::vector<std::string>::const_iterator targetItr = targetStrings.begin();
    std::vector<std::string>::const_iterator targetEnd = targetStrings.end();
    while( targetItr != targetEnd ) {
      int exp = targetBase.baseUnitExponent( *targetItr );
      if( exp != 0) {
        converted.setBaseUnitExponent(*targetItr,converted.baseUnitExponent(*targetItr) + 
                                                 workingExp*exp);
      }
      ++targetItr;
    }//End while( convItr != targetEnd )
  }

  // Set result scale to match original scale
  if( scaleExponent != 0 ) {
    converted.setScale(scaleExponent);
  }

  // Check if there is a pretty string for the result
  std::string pretty = UnitFactory::instance().lookupPrettyString(
    converted.standardUnitsString(false) );
  if( !(pretty.empty()) ) {
    converted.setPrettyUnitsString( pretty );
  }

  return converted;
}
예제 #24
0
boost::optional<Quantity> QuantityConverterSingleton::m_convertToSI(const Quantity &original) const
{
  // create a working copy of the original
  Quantity working(original);
  // Make sure to work unscaled: 10^0
  int scaleExponent = working.scale().exponent;
  if (working.scale().exponent != 0) {
    working.setScale(0);
  }
  // build a result quantity with SI units and value equal to original
  Quantity result(working.value(), UnitSystem(UnitSystem::SI));

  // Get the base units of original
  std::vector<std::string> baseOfOriginal = original.baseUnits();
  // Loop over base units in original and apply conversions found in m_toSImap
  std::vector<std::string>::const_iterator it = baseOfOriginal.begin();
  std::vector<std::string>::const_iterator end = baseOfOriginal.end();
  while( it != end ) {
    int baseExponent = working.baseUnitExponent(*it);
    // apply conversion factor
    BaseUnitConversionMap::const_iterator mapItr = m_toSImap.find(*it);
    if (mapItr == m_toSImap.end()) {
      LOG(Error,"Cannot convert base unit '" << *it << "' to SI because it is not "
          << "registered with the QuantityConverter.");
      return boost::none;
    }
    baseUnitConversionFactor factor = mapItr->second;
    if (factor.offset != 0.0) {
      for( int i = 0; i < std::abs(baseExponent); ++i) {
        if( baseExponent > 0 ){
          result.setValue( (result.value() * factor.factor) + factor.offset);
        }else {
          result.setValue( (result.value() / factor.factor) + factor.offset);
        }
      }
    }
    else {
      result.setValue( result.value() * std::pow(factor.factor,baseExponent) );
    }
    // Parse the conversion string in case the original converts to more than one SI base unit
    Unit targetBase = parseUnitString(factor.targetUnit);
    std::vector<std::string> targetStrings = targetBase.baseUnits();
    std::vector<std::string>::const_iterator targetItr = targetStrings.begin();
    std::vector<std::string>::const_iterator targetEnd = targetStrings.end();
    while( targetItr != targetEnd ) {
      int exp = targetBase.baseUnitExponent( *targetItr );
      if( exp != 0 ) {
        result.setBaseUnitExponent(*targetItr,result.baseUnitExponent(*targetItr) + 
                                              baseExponent*exp);
      }
      ++targetItr;
    }//End while( convItr != convEnd )
    ++it;
  }//End while( it != end )

  // Set result scale to match original scale
  if( scaleExponent != 0 ) {
    result.setScale(scaleExponent);
  }

  // Check if there is a pretty string for the result
  std::string pretty = UnitFactory::instance().lookupPrettyString( 
    result.standardUnitsString(false) );
  if( !(pretty.empty()) ) {
    result.setPrettyUnitsString( pretty );
  }

  return result;
}
  /**
   * Returns evaluations of all basis functions that are non-zero at a given evaluation point.
   * For a given evaluation point \f$x\f$, it stores tuples (std::pair) of
   * \f$(i,\phi_i(x))\f$ in the result vector for all basis functions that are non-zero.
   * If one wants to evaluate \f$f_N(x)\f$, one only has to compute
   * \f[ \sum_{r\in\mathbf{result}} \alpha[r\rightarrow\mathbf{first}] \cdot r\rightarrow\mathbf{second}. \f]
   *
   * @param basis a sparse grid basis
   * @param point evaluation point within the domain
   * @param alpha the sparse grid's coefficients
   *
   * @result result result of the function evaluation
   */
  float_t operator()(BASIS& basis, const DataVector& point,
                     const DataVector& alpha) {
    GridStorage::grid_iterator working(storage);

    // typedef GridStorage::index_type::level_type level_type;
    typedef GridStorage::index_type::index_type index_type;

    size_t bits = sizeof(index_type) *
                  8;  // how many levels can we store in a index_type?

    size_t dim = storage->dim();

    // Check for bounding box
    BoundingBox* bb = storage->getBoundingBox();
    DataVector newPoint(point);

    if ( bb != NULL ) {
      for (size_t d = 0; d < dim; ++d) {
        DimensionBoundary dimbb = bb->getBoundary(d);
        // std::cout << "Dimension: " << d << " (left: " <<
        // dimbb.leftBoundary << ", right: " << dimbb.rightBoundary << ")" <<
        // std::endl;

        if (dimbb.leftBoundary == 0.0 && dimbb.rightBoundary == 1.0) {
          continue;
        }

        if (!(dimbb.leftBoundary <= newPoint[d]
              && newPoint[d] <= dimbb.rightBoundary) ) {
          // std::cout << "Out of bounds: " << point[d] << std::endl;
          return 0.0;
        }

        // std::cout << "Old: " << point[d] << std::endl;
        newPoint[d] = (newPoint[d] - dimbb.leftBoundary) /
                      (dimbb.rightBoundary - dimbb.leftBoundary);
        // std::cout << "New: " << point[d] << std::endl;
      }
    }

    index_type* source = new index_type[dim];

    for (size_t d = 0; d < dim; ++d) {
      // This does not really work on grids with borders.
      float_t temp = floor(newPoint[d] *
                           static_cast<float_t>(1 << (bits - 2))) * 2;

      if (newPoint[d] == 1.0) {
        source[d] = static_cast<index_type> (temp - 1);
      } else {
        source[d] = static_cast<index_type> (temp + 1);
      }
    }

    float_t result = 0.0;

    rec(basis, point, 0, 1.0, working, source, alpha, result);

    delete[] source;

    return result;
  }
예제 #26
0
// system-config-printer --setup-printer='file:/tmp/printout' --devid='MFG:Ricoh;MDL:Aficio SP C820DN'
PageDestinations::PageDestinations(const QVariantHash &args, QWidget *parent) :
    GenericPage(parent),
    ui(new Ui::PageDestinations),
    m_chooseLpd(new ChooseLpd(this)),
    m_chooseSamba(new ChooseSamba(this)),
    m_chooseSerial(new ChooseSerial(this)),
    m_chooseSocket(new ChooseSocket(this)),
    m_chooseUri(new ChooseUri(this)),
    m_chooseLabel(new QLabel(this))
{
    ui->setupUi(this);
    setAttribute(Qt::WA_DeleteOnClose);

    ui->stackedWidget->addWidget(m_chooseLpd);
    connect(m_chooseLpd, SIGNAL(allowProceed(bool)), SIGNAL(allowProceed(bool)));

    ui->stackedWidget->addWidget(m_chooseSamba);
    connect(m_chooseSamba, SIGNAL(allowProceed(bool)), SIGNAL(allowProceed(bool)));

    ui->stackedWidget->addWidget(m_chooseSerial);
    connect(m_chooseSerial, SIGNAL(allowProceed(bool)), SIGNAL(allowProceed(bool)));

    ui->stackedWidget->addWidget(m_chooseSocket);
    connect(m_chooseSocket, SIGNAL(allowProceed(bool)), SIGNAL(allowProceed(bool)));

    ui->stackedWidget->addWidget(m_chooseUri);
    connect(m_chooseUri, SIGNAL(allowProceed(bool)), SIGNAL(allowProceed(bool)));

    m_chooseLabel->setAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
    ui->stackedWidget->addWidget(m_chooseLabel);

    // Hide the message widget
    ui->messageWidget->setMessageType(KMessageWidget::Error);
    ui->messageWidget->hide();

    // setup default options
    setWindowTitle(i18nc("@title:window", "Select a Printer to Add"));
    m_model = new DevicesModel(this);
    ui->devicesTV->setModel(m_model);
    ui->devicesTV->setItemDelegate(new NoSelectionRectDelegate(this));
    connect(ui->devicesTV->selectionModel(), SIGNAL(selectionChanged(QItemSelection,QItemSelection)),
            this, SLOT(deviceChanged()));
    connect(m_model, SIGNAL(errorMessage(QString)), ui->messageWidget, SLOT(setText(QString)));
    connect(m_model, SIGNAL(errorMessage(QString)), ui->messageWidget, SLOT(animatedShow()));

    // Expand when a parent is added
    connect(m_model, SIGNAL(parentAdded(QModelIndex)),
            ui->devicesTV, SLOT(expand(QModelIndex)));

    // Update the view when the device URI combo box changed
    connect(ui->connectionsCB, SIGNAL(currentIndexChanged(int)),
            this, SLOT(deviceUriChanged()));
    ui->connectionsGB->setVisible(false);

    // Setup the busy cursor
    working();
    connect(m_model, SIGNAL(loaded()), this, SLOT(notWorking()));

    if (!args.isEmpty()) {
        // set our args
        setValues(args);
    }
}
예제 #27
0
파일: ftnsetup.c 프로젝트: ftnapps/FTNd
void site_docs(void)
{
    FILE    *fp, *hp, *toc;
    char    temp[PATH_MAX], temp1[PATH_MAX];
    int	    page = 0, line = 0;

    if (config_read() == -1)
	return;

    snprintf(temp, PATH_MAX, "%s/share/doc/site.doc", getenv("FTND_ROOT"));
    mkdirs(temp, 0755);
    if ((fp = fopen(temp, "w")) == NULL)
	return;

    snprintf(temp1, PATH_MAX, "%s/tmp/toc.tmp", getenv("FTND_ROOT"));
    if ((toc = fopen(temp1, "w+")) == NULL) {
	fclose(fp);
	return;
    }

    clr_index();
    working(1, 0, 0);
    IsDoing("Making Sitedocs");
    Syslog('+', "Start creating sitedocs");

    set_color(WHITE, BLACK);
    ftnd_mvprintw( 5, 6, "21.  CREATING SITEDOCS");
    set_color(CYAN, BLACK);
    ftnd_mvprintw( 7,11, (char *)"Erasing directory         %s/share/doc/html", getenv("FTND_ROOT"));
    fflush(stdout);

    snprintf(temp, PATH_MAX, "-r -f %s/share/doc/html", getenv("FTND_ROOT"));
    execute_pth((char *)"rm", temp, (char *)"/dev/null", (char *)"/dev/null", (char *)"/dev/null");

    if ((hp = open_webdoc((char *)"index.html", (char *)"BBS Site Documentation", NULL))) {
	fprintf(hp, "<UL>\n");
	fprintf(hp, " <LI><A HREF=\"global.html\">Global Configuration</A></LI>\n");
	fprintf(hp, " <LI><A HREF=\"fidonet.html\">Fido Networks</A></LI>\n");
	fprintf(hp, " <LI><A HREF=\"archivers.html\">Archivers</A></LI>\n");
	fprintf(hp, " <LI><A HREF=\"virscan.html\">Virus Scanners</A></LI>\n");
	fprintf(hp, " <LI><A HREF=\"modem.html\">Modem Types</A></LI>\n");
	fprintf(hp, " <LI><A HREF=\"ttyinfo.html\">TTY Lines Info</A></LI>\n");
	fprintf(hp, " <LI><A HREF=\"nodes.html\">Fidonet Nodes</A></LI>\n");
	fprintf(hp, " <LI>BBS: <A HREF=\"limits.html\">Security Limits</A></LI>\n");
	fprintf(hp, " <LI>BBS: <A HREF=\"language.html\">Language Setup</A></LI>\n");
	fprintf(hp, " <LI>BBS: <A HREF=\"menus.html\">BBS Menus</A></LI>\n");
	fprintf(hp, " <LI>BBS: <A HREF=\"fileareas.html\">File Areas</A></LI>\n");
	fprintf(hp, " <LI>BBS: <A HREF=\"protocol.html\">Transfer Protocols</A></LI>\n");
	fprintf(hp, " <LI>BBS: <A HREF=\"oneliners.html\">Oneliners</A></LI>\n");
	fprintf(hp, " <LI>Mail: <A HREF=\"msggroup.html\">Echomail Groups</A></LI>\n");
	fprintf(hp, " <LI>Mail: <A HREF=\"msgareas.html\">Echomail Areas</A></LI>\n");
	fprintf(hp, " <LI>TIC: <A HREF=\"filegroup.html\">FileEcho Groups</A></LI>\n");
	fprintf(hp, " <LI>TIC: <A HREF=\"ticareas.html\">Fileecho Areas</A></LI>\n");
	fprintf(hp, " <LI>TIC: <A HREF=\"hatch.html\">Hatch Manager</A></LI>\n");
	fprintf(hp, " <LI>TIC: <A HREF=\"magic.html\">Magic Files</A></LI>\n");
	fprintf(hp, " <LI><A HREF=\"newgroup.html\">Newfiles Groups</A></LI>\n");
	fprintf(hp, " <LI><A HREF=\"newfiles.html\">Newfiles Reports</A></LI>\n");
	fprintf(hp, " <LI><A HREF=\"filefind.html\">Filefind Setup</A></LI>\n");
	fprintf(hp, " <LI><A HREF=\"users.html\">BBS Users</A></LI>\n");
	fprintf(hp, " <LI><A HREF=\"service.html\">Mail Service Manager</A></LI>\n");
	fprintf(hp, " <LI><A HREF=\"domain.html\">Domain translation</A></LI>\n");
	fprintf(hp, " <LI><A HREF=\"task.html\">Task Manager</A></LI>\n");
	fprintf(hp, " <LI><A HREF=\"route.html\">Network Routing</A></LI>\n");
	fprintf(hp, " <LI><A HREF=\"ibcsrv.html\">Internet BBS Chat</A></LI>\n");
        fprintf(hp, "</UL>\n");
        close_webdoc(hp);
    } else {
        Syslog('+', "Can't create html documentation");
    }

    ftnd_mvprintw(8,11, (char *)"Creating site documents");
    fflush(stdout);
    horiz = 35;
    page = global_doc(fp, toc, page);
    dotter();
    page = fido_doc(fp, toc, page);
    dotter();
    page = archive_doc(fp, toc, page);
    dotter();
    page = virus_doc(fp, toc, page);
    dotter();
    page = modem_doc(fp, toc, page);
    dotter();
    page = tty_doc(fp, toc, page);
    dotter();
    page = node_doc(fp, toc, page);
    dotter();
    page = bbs_doc(fp, toc, page);
    dotter();
    page = mail_doc(fp, toc, page);
    dotter();
    page = tic_doc(fp, toc, page);
    dotter();
    page = newf_group_doc(fp, toc, page);
    dotter();
    page = new_doc(fp, toc, page);
    dotter();
    page = ff_doc(fp, toc, page);
    dotter();
    page = service_doc(fp, toc, page);
    dotter();
    page = domain_doc(fp, toc, page);
    dotter();
    page = task_doc(fp, toc, page);
    dotter();
    page = route_doc(fp, toc, page);
    dotter();
    page = ibc_doc(fp, toc, page);
    dotter();
    users_doc();
    dotter();
    ol_doc();
    clrtoeol();
    ftnd_mvprintw( 8,11, (char *)"Created site documents in %s/share/doc", getenv("FTND_ROOT"));
    fflush(stdout);

    /*
     * Append table of contents
     */
    page = newpage(fp, page);
    addtoc(fp, toc, 21, 0, page, (char *)"Table of contents");
    fprintf(fp, "\n\n");
    line = 4;
    rewind(toc);

    while (fgets(temp, 256, toc) != NULL) {
	fprintf(fp, "%s", temp);
	line++;
	if (line == 56) {
	    page = newpage(fp, page);
	    line = 0;
	}
    }

    fprintf(fp, "\f");
    fclose(fp);
    fclose(toc);
    unlink(temp1);

    Syslog('+', "Sitedocs created");

    /*
     * Remove obsolete documents
     */
    snprintf(temp, PATH_MAX, "%s/doc/xref.doc", getenv("FTND_ROOT"));
    unlink(temp);
    snprintf(temp, PATH_MAX, "%s/doc/stat.doc", getenv("FTND_ROOT"));
    unlink(temp);

    center_addstr(LINES -4, (char *)"Press any key");
    readkey(LINES -4, COLS / 2 + 8, LIGHTGRAY, BLACK);
    return;
}
예제 #28
0
파일: m_ngroup.c 프로젝트: ftnapps/FTNd
char *PickNGroup(char *shdr)
{
	static	char MGrp[21] = "";
	int	records, i, o = 0, y, x;
	char	pick[12];
	FILE	*fil;
	char	temp[PATH_MAX];
	int	offset;


	clr_index();
	working(1, 0, 0);
	if (config_read() == -1) {
		working(2, 0, 0);
		return MGrp;
	}

	records = CountNGroup();
	if (records == -1) {
		working(2, 0, 0);
		return MGrp;
	}


	for (;;) {
		clr_index();
		set_color(WHITE, BLACK);
		snprintf(temp, 81, "%s.  NEWFILES GROUP SELECT", shdr);
		ftnd_mvprintw( 5, 4, temp);
		set_color(CYAN, BLACK);
		if (records != 0) {
			snprintf(temp, PATH_MAX, "%s/etc/ngroups.data", getenv("FTND_ROOT"));
			working(1, 0, 0);
			if ((fil = fopen(temp, "r")) != NULL) {
				fread(&ngrouphdr, sizeof(ngrouphdr), 1, fil);
				x = 2;
				y = 7;
				set_color(CYAN, BLACK);
				for (i = 1; i <= 20; i++) {
					if (i == 11) {
						x = 42;
						y = 7;
					}
					if ((o + i) <= records) {
						offset = sizeof(ngrouphdr) + (((o + i) - 1) * ngrouphdr.recsize);
						fseek(fil, offset, 0);
						fread(&ngroup, ngrouphdr.recsize, 1, fil);
						if (ngroup.Active)
							set_color(CYAN, BLACK);
						else
							set_color(LIGHTBLUE, BLACK);
						snprintf(temp, 81, "%3d.  %-12s %-18s", o + i, ngroup.Name, ngroup.Comment);
						temp[38] = '\0';
						ftnd_mvprintw(y, x, temp);
						y++;
					}
				}
				fclose(fil);
			}
		}
		strcpy(pick, select_pick(records, 20));

		if (strncmp(pick, "-", 1) == 0) 
			return MGrp;

		if (strncmp(pick, "N", 1) == 0)
			if ((o + 20) < records)
				o = o + 20;

		if (strncmp(pick, "P", 1) == 0)
			if ((o - 20) >= 0)
				o = o - 20;

		if ((atoi(pick) >= 1) && (atoi(pick) <= records)) {
			snprintf(temp, PATH_MAX, "%s/etc/ngroups.data", getenv("FTND_ROOT"));
			fil = fopen(temp, "r");
			offset = sizeof(ngrouphdr) + ((atoi(pick) - 1) * ngrouphdr.recsize);
			fseek(fil, offset, 0);
			fread(&ngroup, ngrouphdr.recsize, 1, fil);
			fclose(fil);
			strcpy(MGrp, ngroup.Name);
			return MGrp;
		}
	}
}
예제 #29
0
파일: m_ngroup.c 프로젝트: ftnapps/FTNd
void EditNGroup(void)
{
	int	records, i, o, x, y;
	char	pick[12];
	FILE	*fil;
	char	temp[PATH_MAX];
	int	offset;

	clr_index();
	working(1, 0, 0);
	IsDoing("Browsing Menu");
	if (config_read() == -1) {
		working(2, 0, 0);
		return;
	}

	records = CountNGroup();
	if (records == -1) {
		working(2, 0, 0);
		return;
	}

	if (OpenNGroup() == -1) {
		working(2, 0, 0);
		return;
	}
	o = 0;

	for (;;) {
		clr_index();
		set_color(WHITE, BLACK);
		ftnd_mvprintw( 5, 4, "11. NEWFILES GROUPS SETUP");
		set_color(CYAN, BLACK);
		if (records != 0) {
			snprintf(temp, PATH_MAX, "%s/etc/ngroups.temp", getenv("FTND_ROOT"));
			working(1, 0, 0);
			if ((fil = fopen(temp, "r")) != NULL) {
				fread(&ngrouphdr, sizeof(ngrouphdr), 1, fil);
				x = 2;
				y = 7;
				set_color(CYAN, BLACK);
				for (i = 1; i <= 20; i++) {
					if (i == 11 ) {
						x = 42;
						y = 7;
					}
					if ((o + i) <= records) {
						offset = sizeof(ngrouphdr) + (((o + i) - 1) * ngrouphdr.recsize);
						fseek(fil, offset, 0);
						fread(&ngroup, ngrouphdr.recsize, 1, fil);
						if (ngroup.Active)
							set_color(CYAN, BLACK);
						else
							set_color(LIGHTBLUE, BLACK);
						snprintf(temp, 81, "%3d.  %-12s %-18s", o + i, ngroup.Name, ngroup.Comment);
						temp[38] = '\0';
						ftnd_mvprintw(y, x, temp);
						y++;
					}
				}
				fclose(fil);
			}
		}
		strcpy(pick, select_record(records, 20));
		
		if (strncmp(pick, "-", 1) == 0) {
			CloseNGroup(FALSE);
			return;
		}

		if (strncmp(pick, "A", 1) == 0) {
			working(1, 0, 0);
			if (AppendNGroup() == 0) {
				records++;
				working(1, 0, 0);
			} else
				working(2, 0, 0);
		}

		if (strncmp(pick, "N", 1) == 0)
			if ((o + 20) < records)
				o = o + 20;

		if (strncmp(pick, "P", 1) == 0)
			if ((o - 20) >= 0)
				o = o - 20;

		if ((atoi(pick) >= 1) && (atoi(pick) <= records)) {
			EditNGrpRec(atoi(pick));
			o = ((atoi(pick) - 1) / 20) * 20;
		}
	}
}
예제 #30
0
파일: m_ngroup.c 프로젝트: ftnapps/FTNd
/*
 * Edit one record, return -1 if there are errors, 0 if ok.
 */
int EditNGrpRec(int Area)
{
	FILE	*fil;
	char	mfile[PATH_MAX];
	int	offset;
	int	j;
	unsigned int	crc, crc1;

	clr_index();
	working(1, 0, 0);
	IsDoing("Edit NewfileGroup");

	snprintf(mfile, PATH_MAX, "%s/etc/ngroups.temp", getenv("FTND_ROOT"));
	if ((fil = fopen(mfile, "r")) == NULL) {
		working(2, 0, 0);
		return -1;
	}

	offset = sizeof(ngrouphdr) + ((Area -1) * sizeof(ngroup));
	if (fseek(fil, offset, 0) != 0) {
		working(2, 0, 0);
		return -1;
	}

	fread(&ngroup, sizeof(ngroup), 1, fil);
	fclose(fil);
	crc = 0xffffffff;
	crc = upd_crc32((char *)&ngroup, crc, sizeof(ngroup));
	NgScreen();
	
	for (;;) {
		set_color(WHITE, BLACK);
		show_str(  7,18,12, ngroup.Name);
		show_str(  8,18,55, ngroup.Comment);
		show_bool( 9,18,    ngroup.Active);
		show_bool(10,18,    ngroup.Deleted);

		j = select_menu(4);
		switch(j) {
		case 0:
			crc1 = 0xffffffff;
			crc1 = upd_crc32((char *)&ngroup, crc1, sizeof(ngroup));
			if (crc != crc1) {
				if (yes_no((char *)"Record is changed, save") == 1) {
					working(1, 0, 0);
					if ((fil = fopen(mfile, "r+")) == NULL) {
						working(2, 0, 0);
						return -1;
					}
					fseek(fil, offset, 0);
					fwrite(&ngroup, sizeof(ngroup), 1, fil);
					fclose(fil);
					NGrpUpdated = 1;
					working(6, 0, 0);
				}
			}
			IsDoing("Browsing Menu");
			return 0;
		case 1: E_UPS( 7,18,12,ngroup.Name,"The ^name^ for this message group")
		case 2: E_STR( 8,18,55,ngroup.Comment,"The ^desription^ for this message group")
		case 3: E_BOOL(9,18,   ngroup.Active, "Is this message group ^active^")
		case 4: E_BOOL(10,18,  ngroup.Deleted, "Is this group ^Deleted^")
		}
	}

	return 0;
}